From bfba1352e44d462a8acb2a45fc11f7f88f4943c6 Mon Sep 17 00:00:00 2001 From: dmiller Date: Thu, 7 Nov 2024 23:43:26 +0000 Subject: [PATCH] Fix UDP listen on Windows: recvfrom behaves differently. --- ncat/ncat_listen.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ncat/ncat_listen.c b/ncat/ncat_listen.c index 7757a9c65..954137ab6 100644 --- a/ncat/ncat_listen.c +++ b/ncat/ncat_listen.c @@ -450,8 +450,24 @@ static void handle_connection(int socket_accept, int type, fd_set *listen_fds) int nbytes = recvfrom(socket_accept, buf, sizeof(buf), MSG_PEEK, &s.remoteaddr.sockaddr, &s.ss_len); if (nbytes < 0) { - loguser("%s.\n", socket_strerror(socket_errno())); - return; + int err = socket_errno(); + switch (err) { + // Recoverable try-again errors: + case EINTR: + case EAGAIN: + loguser("%s.\n", socket_strerror(socket_errno())); + return; + // Ignorable errors: + // Windows returns SOCKET_ERROR and WSAEMSGSIZE instead of truncating! + case EMSGSIZE: + if (s.remoteaddr.sockaddr.sa_family != AF_UNSPEC) + break; + // everything else: + default: + die("recvfrom"); + return; + break; + } } /* * We're using connected udp. This has the down side of only