]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
attempt to fix trbnetd for frequently being blocked in udp receive of large messages large_ethernet
authorJoern Adamczewski-Musch <j.adamczewski@gsi.de>
Fri, 6 Mar 2026 09:33:42 +0000 (10:33 +0100)
committerhadaq <hadaq@hades33.gsi.de>
Fri, 6 Mar 2026 09:33:42 +0000 (10:33 +0100)
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

index f27b90e63df27a1d4d6569d1044d9c47eed4c8b4..d2bcacd2a0792653456b10c90f8d9aee23e694c7 100644 (file)
@@ -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) {