2012-11-25 18 views
22

मैं यूडीपी सॉकेट पर 100 एमएमएस टाइमआउट सेट करने की कोशिश कर रहा हूं। मैं सी का उपयोग कर रहा हूं। मैंने नीचे दिए गए कोड के रिवेंट टुकड़े पोस्ट किए हैं। मुझे यकीन नहीं है कि यह समय क्यों नहीं चल रहा है, लेकिन जब इसे सेगमेंट प्राप्त नहीं होता है तो बस लटकता है। क्या यह केवल उन सॉकेट पर काम करता है जो बाइंड() विधि का उपयोग करके बाध्य नहीं हैं?यूडीपी सॉकेट सेट टाइमआउट

#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

ऐसा लगता है कि आप 'setsockopt' से वापसी मान जाँच नहीं कर रहे हैं की तरह अगर यह एक त्रुटि लौटाई को देखने के लिए। यह शायद है। 'SO_RCVTIMEO' को 'स्ट्रक्चर टाइमवल' लेने के लिए लिनक्स और मैकोज़ दोनों पर दस्तावेज किया गया है, लेकिन आप 'int' पास कर रहे हैं। इसके बजाए 'स्ट्रक्चर टाइमवल' पास करने का प्रयास करें। साथ ही, आप 'char *' पर '& timeout' क्यों कास्टिंग कर रहे हैं? यह बिल्कुल 'char *' नहीं है। – Celada

उत्तर

40

SO_RCVTIMEO विकल्प की उम्मीद एक struct timevalsys/time.h में परिभाषित किया गया है, न की तरह आप इसे करने के गुजर रहे एक पूर्णांक। timeval struct में सेकेंड के लिए फ़ील्ड और माइक्रोसेकंड के लिए फ़ील्ड है। 100ms के लिए समय समाप्ति सेट करने के लिए निम्नलिखित चाल करना चाहिए:

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"); 
}