2012-11-25 22 views
22

UDP Soketine 100 ms zaman aşımı ayarlamaya çalışıyorum. Ben C kullanıyorum. Kodumun yinelenen parçalarını aşağıda yazdım. Bunun neden zaman aşımına uğramadığından emin değilim, ancak sadece bir segment almadığında kilitleniyor. Bu, yalnızca bind() yöntemini kullanarak bağlı olmayan yuvalarda çalışır mı?UDP Soket Zaman Aşımı Ayarı

#define TIMEOUT_MS  100  /* Seconds between retransmits */ 

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
    DieWithError("socket() failed"); 

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
    DieWithError("socket() failed"); 

//set timer for recv_socket 
static int timeout = TIMEOUT_MS; 
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); 

if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0, 
     (struct sockaddr *) &servAddr2, &fromSize) < 0){ 
    //timeout reached 
    printf("Timout reached. Resending segment %d\n", seq_num); 
    num_timeouts++; 
} 
+2

görünüyor. Muhtemelen öyle. 'SO_RCVTIMEO', Linux ve MacOS’ta' struct timeval' için belgelenmiştir, ancak bir 'int' geçiyorsunuz. Bunun yerine bir struct timeval'ı geçmeyi deneyin. Ayrıca, neden 'char tim' '' ve timeout' '' a çeviriyorsunuz? Hiç bir “char *” değil. – Celada

cevap

40

SO_RCVTIMEO seçenek beklediği bir struct timevalsys/time.h tanımlanan, buna geçen konum gibi değil bir tamsayı. timeval struct, saniyeler için bir alana ve mikrosaniye için bir alana sahiptir. 100ms zaman aşımı ayarlamak için aşağıdaki yöntemi olmalıdır: Eğer bir hata döndürdü olmadığını görmek için `setsockopt` dönüş değeri kontrol etmiyor gibi

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 100000; 
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) { 
    perror("Error"); 
}