Guest User

Untitled

a guest
Apr 8th, 2019
98
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. int wait_snd(int sock)                                                              
  2. {                                                                                  
  3.     fd_set RD, WR, EXP;                                                            
  4.     struct timespec ts;                                                            
  5.     int R;                                                                          
  6.                                                                                    
  7.     FD_ZERO(&RD);                                                                  
  8.     FD_ZERO(&WR);                                                                  
  9.     FD_ZERO(&EXP);                                                                  
  10.                                                                                    
  11.     FD_SET(sock, &WR);                                                              
  12.                                                                                    
  13.     ts.tv_sec = 0;                                                                  
  14.     ts.tv_nsec = 100;                                                              
  15.                                                                                    
  16. reselect:                                                                          
  17.     R = select(sock+1, NULL, &WR, NULL, NULL);                                      
  18.     switch (R)                                                                      
  19.     {                                                                              
  20.     case 0:                                                                        
  21.     case 1:                                                                        
  22.         return R;                                                                  
  23.     case -1:                                                                        
  24.     default:                                                                        
  25.         switch(errno)                                                              
  26.         {                                                                          
  27.         case EINTR:                                                                
  28.             goto reselect;                                                          
  29.         default:                                                                    
  30.             return -errno;                                                          
  31.         }                                                                          
  32.     }                                                                              
  33. }
  34.  
  35. int main()
  36. {
  37. ...
  38.     clock_gettime(CLOCK_MONOTONIC, &ts_a);                                      
  39. _sendto:                                                                        
  40.     if (wait_snd(sockfd) != 1)                                                  
  41.         goto _sendto;                                                            
  42.     ret = sendto(sockfd, buf, fsize, 0, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_ll));
  43.     if (ret < 0) {                                                              
  44.         if (errno == ENOBUFS)                                                    
  45.         {                                                                        
  46.              printf("ENOBUFS catched\n");                                        
  47.              printf("Retrrying a packet...\n");                                  
  48.              goto _sendto;                                                      
  49.         }                                                                        
  50.         if (errno == EAGAIN)                                                    
  51.         {                                                                        
  52.              printf("EAGAIN catched\n");                                        
  53.              printf("Retrrying a packet...\n");                                  
  54.              goto _sendto;                                                      
  55.         }                                                                        
  56.         fprintf(stderr, "sendto %s (%d): %s (%d)\n", ifmac2name(sockaddr.sll_addr, mactable), fsize, strerror(errno), errno);
  57.              goto _sendto;                                                      
  58.     }                                                                            
  59.     clock_gettime(CLOCK_MONOTONIC, &ts_b);                                      
  60.     if (ret != fsize)                                                            
  61.         printf("%d\n", ret), exit(0);                                            
  62.     snd_bytes += ret;                                                            
  63.     snd_nsec += ((ts_b.tv_nsec < ts_a.tv_nsec) ? ((NSECS_IN_SEC - ts_a.tv_nsec) + ts_b.tv_nsec) : (ts_b.tv_nsec - ts_a.tv_nsec));
  64. ...
  65. }
RAW Paste Data Copied