diff --git a/src/vdmodem/vdmodem.c b/src/vdmodem/vdmodem.c index c0a1a959609b6e6c59b213b5c74d843761805a76..da8416875432b897a160d5a176f452709c7e5827 100644 --- a/src/vdmodem/vdmodem.c +++ b/src/vdmodem/vdmodem.c @@ -42,6 +42,7 @@ #define VERSION "0.1" bool external_socket; +union xp_sockaddr addr; SOCKET sock = INVALID_SOCKET; SOCKET listening_sock = INVALID_SOCKET; HANDLE hangup_event = INVALID_HANDLE_VALUE; // e.g. program drops DTR @@ -679,28 +680,16 @@ char* answer(struct modem* modem) if(listening_sock == INVALID_SOCKET) return response(modem, NO_DIAL_TONE); - fd_set fds = {0}; - FD_SET(listening_sock, &fds); - struct timeval tv = { 0, 0 }; - if(select(/* ignored: */0, &fds, NULL, NULL, &tv) != 1) + if(sock == INVALID_SOCKET) return response(modem, NO_CARRIER); - union xp_sockaddr addr; - socklen_t addrlen = sizeof(addr); - sock = accept(listening_sock, (SOCKADDR*)&addr, &addrlen); - if(sock == INVALID_SOCKET) { - dprintf("!accept returned %d (errno=%ld)", sock, WSAGetLastError()); - return response(modem, NO_CARRIER); - } setsockopts(sock); - char tmp[256]; - dprintf("Connection accepted from TCP port %hu at %s", inet_addrport(&addr), inet_addrtop(&addr, tmp, sizeof(tmp))); - if(cfg.client_file[0]) { FILE* fp = fopen(cfg.client_file, "wt"); if(fp == NULL) dprintf("!Error %d creating '%s'", errno, cfg.client_file); else { + char tmp[256]; fprintf(fp, "sock=%d\n", sock); fprintf(fp, "addr=%s\n", inet_addrtop(&addr, tmp, sizeof(tmp))); fprintf(fp, "port=%u\n", inet_addrport(&addr)); @@ -983,17 +972,22 @@ void listen_thread(void* arg) FD_SET(listening_sock, &fds); struct timeval tv = { 1, 0 }; if(select(/* ignored: */0, &fds, NULL, NULL, &tv) == 1) { + union xp_sockaddr newaddr; + socklen_t addrlen = sizeof(newaddr); + SOCKET newsock = accept(listening_sock, (SOCKADDR*)&newaddr, &addrlen); + if(newsock == INVALID_SOCKET) + continue; + char tmp[256]; + dprintf("Connection accepted from TCP port %hu at %s" + ,inet_addrport(&newaddr), inet_addrtop(&newaddr, tmp, sizeof(tmp))); if(sock != INVALID_SOCKET) { // In-use - SOCKADDR_IN addr; - socklen_t addrlen = sizeof(addr); - SOCKET newsock = accept(listening_sock, (SOCKADDR*)&addr, &addrlen); - if(newsock != INVALID_SOCKET) { - send(newsock, cfg.busy_notice, strlen(cfg.busy_notice), /* flags: */0); - shutdown(newsock, SD_SEND); - closesocket(newsock); - } + send(newsock, cfg.busy_notice, strlen(cfg.busy_notice), /* flags: */0); + shutdown(newsock, SD_SEND); + closesocket(newsock); continue; } + sock = newsock; + addr = newaddr; if(!modem->offhook && !modem->online) modem->ringing = true; } @@ -1297,8 +1291,8 @@ int main(int argc, char** argv) dprintf("recv returned %d", rd); if(rd <= 0) { int error = WSAGetLastError(); - if(rd == 0 || error == WSAECONNRESET) { - dprintf("Connection reset (error %d, %s) detected on socket %ld", error, strerror(error), sock); + if(rd == 0 || error == WSAECONNRESET || error == WSAECONNABORTED) { + dprintf("Connection reset (error %d) detected on socket %ld", error, sock); disconnect(&modem); vdd_writestr(&wrslot, response(&modem, NO_CARRIER)); continue;