From 53b21837c8b521ae966a10d349b410d90585901c Mon Sep 17 00:00:00 2001 From: Joern Adamczewski-Musch Date: Fri, 6 Mar 2026 10:33:42 +0100 Subject: [PATCH] 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 --- libtrbnet/trbnet.c | 54 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 16 deletions(-) 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) { -- 2.51.0