From: Joern Adamczewski-Musch Date: Fri, 6 Mar 2026 09:33:42 +0000 (+0100) Subject: attempt to fix trbnetd for frequently being blocked in udp receive of large messages X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=53b21837c8b521ae966a10d349b410d90585901c;p=trbnettools.git attempt to fix trbnetd for frequently being blocked in udp receive of large messages moved pselect before recvfrom inside multi packet receive loop seems to avoid the situation that trbnetd is sometimes blocked forever at recvfrom although udp packets are actually present (wireshark checks) still under further testing --- diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index f27b90e..d2bcacd 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -420,18 +420,19 @@ static int getUDPPackage() } /* Wait for data ready and Set Socket Timeout */ - FD_ZERO(&fds); - FD_SET(trb3_sockfd, &fds); - - status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL); - if (status == -1) { - trb_errno = TRB_TRB3_SOCKET_ERROR; - return -1; - } - if (FD_ISSET(trb3_sockfd, &fds) == 0) { - trb_errno = TRB_TRB3_SOCKET_TIMEOUT; - return -1; - } +// FD_ZERO(&fds); +// FD_SET(trb3_sockfd, &fds); +// +// status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL); +// if (status == -1) { +// trb_errno = TRB_TRB3_SOCKET_ERROR; +// return -1; +// } +// if (FD_ISSET(trb3_sockfd, &fds) == 0) { +// trb_errno = TRB_TRB3_SOCKET_TIMEOUT; +// return -1; +// } +///// JAM2026: moved down into while loop /* Read Data */ @@ -446,6 +447,25 @@ static int getUDPPackage() // gk this fragment rewritten to support multi-packet responses while(1) { + + // JAM2026: moved this inside receiver loop + FD_ZERO(&fds); + FD_SET(trb3_sockfd, &fds); + + status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL); + if (status == -1) { + trb_errno = TRB_TRB3_SOCKET_ERROR; + return -1; + } + if (FD_ISSET(trb3_sockfd, &fds) == 0) { + trb_errno = TRB_TRB3_SOCKET_TIMEOUT; + return -1; + } + + /////////////////////////////////////// + + + status = recvfrom(trb3_sockfd, (void*)dataBufferTemp, @@ -466,11 +486,13 @@ static int getUDPPackage() if (trb_debug > 2) { fprintf(stderr, "udp received: %d\n", status); } - -// fprintf(stderr, "dataBufferSize %d status %d pkt_nr %d\n", dataBufferSize, status, pkt_nr); + + //JAM26 debug: + //fprintf(stderr, "dataBufferSize %d status %d pkt_nr %d\n", dataBufferSize, status, pkt_nr); -// for (i = 0; i < status / 2; i+= 2) -// fprintf(stdout, "%d: %04x %04x\n", i, (unsigned int) dataBufferTemp[i], (unsigned int) dataBufferTemp[i+1]); + //for (i = 0; i < status / 2; i+= 2) + // for (i = 0; i < 40; i+= 2) + // fprintf(stdout, "%d: %04x %04x\n", i, (unsigned int) dataBufferTemp[i], (unsigned int) dataBufferTemp[i+1]); // workaround for minimal successive packet //if (pkt_nr > 1 && status == 12) {