मैं यूडीपी सॉकेट पर 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++;
}
ऐसा लगता है कि आप 'setsockopt' से वापसी मान जाँच नहीं कर रहे हैं की तरह अगर यह एक त्रुटि लौटाई को देखने के लिए। यह शायद है। 'SO_RCVTIMEO' को 'स्ट्रक्चर टाइमवल' लेने के लिए लिनक्स और मैकोज़ दोनों पर दस्तावेज किया गया है, लेकिन आप 'int' पास कर रहे हैं। इसके बजाए 'स्ट्रक्चर टाइमवल' पास करने का प्रयास करें। साथ ही, आप 'char *' पर '& timeout' क्यों कास्टिंग कर रहे हैं? यह बिल्कुल 'char *' नहीं है। – Celada