2013-04-11 6 views
7

मैं एक udp सर्वर/क्लाइंट एप्लिकेशन पर काम कर रहा हूं।रीड_फॉम फ़ंक्शन गैर-अवरुद्ध करना

जानने अगर ग्राहक के किसी भी नीचे है के लिए, सर्वर क्लाइंट के लिए एक हाथ मिलाना संदेश भेजता है। फिर, ग्राहक कुछ डेटा भेजने के लिए क्लाइंट की प्रतिक्रिया के लिए इंतजार कर रहा है ताकि यह सुनिश्चित किया जा सके कि ग्राहक सक्रिय है। इसके लिए सर्वर recvfrom() पर कॉल करता है जब तक कि ग्राहक वापस जवाब न दे, लेकिन यदि ग्राहक नीचे है, तो सर्वर recvfrom() पर कॉल में अनन्त रूप से अवरुद्ध हो जाता है।

मैं अपने सर्वर पर ऐसी कार्यक्षमता को कार्यान्वित करना चाहता हूं ताकि यह किसी विशिष्ट समय के लिए recvfrom() पर कॉल में प्रतीक्षा करे (2 सेकंड कहें)। यदि ग्राहक से 2 सेकंड के भीतर कोई डेटा प्राप्त नहीं हुआ है, तो ग्राहक को मृत माना जाता है और recvfrom() रिटर्न।

क्या ऐसा करने का कोई तरीका है? मैंने इंटरनेट की खोज की लेकिन MSG_DONTWAIT ध्वज सेट करने जैसे समाधान मिले, जो डेटा प्राप्त होने पर तत्काल लौटता है, लेकिन मेरे मामले में, मैं तुरंत वापस लौटने के लिए recvfrom() नहीं चाहता हूं लेकिन समय की विशिष्ट अवधि के लिए डेटा की प्रतीक्षा करता हूं, और उसके लिए कोई डेटा प्राप्त नहीं होता है विशिष्ट अवधि, recvfrom() फ़ंक्शन को फिर से चालू करना चाहिए।

किसी भी मदद की सराहना की है।

+1

ठीक है आप विश्वसनीय सेवा लागू करना चाहते हैं। आप [recvfrom() फ़ंक्शन सेट कर सकते हैं (http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.hala001/rcvf.htm) में ब्लॉकिंग मोड, [fcntl() या ioctl() फ़ंक्शन का उपयोग करके] (http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.hala001/ rcvf.htm)। इसके अलावा इस [यूडीपी विश्वसनीय डेटा सेवा कार्यान्वयन] पढ़ें (http://stackoverflow.com/questions/8353970/udp-reliable-data-service-implementation) –

+1

चेकआउट ** [c - विनसॉक recvfrom के लिए सेट टाइमआउट - स्टैक ओवरफ़्लो] (http://stackoverflow.com/questions/1824465/set-timeout-for-winsock-recvfrom)** –

+1

भी [की जाँच] (http://msdn.microsoft.com/en-us/library/windows/desktop /ms740120%28v=vs.85%29.aspx) .it आपको ** WSARecv() ** में स्पष्ट स्पष्टीकरण देता है (फ़ंक्शन के लिए नियम अवरुद्ध कर रहा है)। –

उत्तर

8

सबसे आसान तरीका है setsockopt() उपयोग करने के लिए एक प्रश्न में सॉकेट के लिए टाइम-आउट प्राप्त स्थापित करने के लिए किया जाएगा।

SO_RCVTIMEO इस के लिए प्रयोग किया जाता है।

यदि recvfrom() पर सॉकेट के लिए टाइम-आउट सेट किया गया है, तो कोई डेटा प्राप्त नहीं होने पर फ़ंक्शन इस समय-आउट के बाद वापस आता है।

उदाहरण के लिए, एक 10 usec टाइम-आउट को पढ़ने के सेट करने के लिए (setsockopt() आवश्यक के रूप में से returnvalue पर त्रुटि की जाँच जोड़ने):

#include <sys/types.h> 
#include <sys/socket.h> 

... 

struct timeval read_timeout; 
read_timeout.tv_sec = 0; 
read_timeout.tv_usec = 10; 
setsockopt(socketfd, SOL_SOCKET, SO_RCVTIMEO, &read_timeout, sizeof read_timeout); 

विवरण on Windows please see here, और on Linux see here और/या here (POSIX) लिए।

+0

यह काम किया, बहुत बहुत :) – Ayse

+3

धन्यवाद या) का उपयोग 'चयन (' सॉकेट के लिए प्रतीक्षा करने के लिए एक समय समाप्ति के भीतर एक पठनीय राज्य में प्रवेश करने के लिए, तो 'फोन recvfrom()' केवल जब सॉकेट वास्तव में पठनीय है इंगित करता है कि डेटा पढ़ने के लिए उपलब्ध है। –

+0

मैं दूसरा 'चयन' का उपयोग करता हूं। आप बहुत बेहतर नियंत्रण प्राप्त करते हैं, और एकाधिक सॉकेट को संभालने के लिए अपस्केल करना आसान है। –

संबंधित मुद्दे