2011-08-24 15 views
32

परीक्षण से, मैंने निष्कर्ष निकाला कि निम्नलिखित तीन मामलों में socket.recv(recv_size) वापस आ जाएगा।socket.recv (recv_size) कब वापस आता है?

  1. कनेक्शन बंद होने के बाद। उदाहरण के लिए, क्लाइंट साइड जिसे सॉकेट.क्लोस() या किसी सॉकेट त्रुटि कहा जाता है, यह खाली स्ट्रिंग लौटाएगा।

  2. कुछ डेटा आते हैं, डेटा का आकार recv_size से अधिक है।

  3. कुछ डेटा आते हैं, डेटा का आकार recv_size से कम है और कम समय के बाद कोई डेटा नहीं आता है (मुझे लगता है कि 0.1s काम करेंगे)।

अधिक # 3 के बारे में विवरण:

#server.py 

while True: 
    data = sock.recv(10) 
    print data, 'EOF' 

#client1.py 

sock.sendall("12345") 
sock.sendall("a" * 50) 

#client2.py 

sock.sendall("12345") 
time.sleep(0.1) 
sock.sendall("a" * 50) 

जब मैं client1.py चलाने के लिए, server.py इको:

12345aaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaa EOF 

जब मैं client2.py चलाने के लिए, server.py इको:

12345 EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 

क्या मेरे निष्कर्ष सही हैं? मैं # 3 के बारे में आधिकारिक विवरण कहां देख सकता हूं?

+0

http://docs.python.org/library/socket.html#socket.socket.recv – mouad

+7

धन्यवाद, लेकिन मैनुअल ने मेरे प्रश्न का उत्तर नहीं दिया। – redice

+3

यहां के बारे में कैसे: http://linux.die.net/man/2/recv – mouad

उत्तर

18

हां, आपका निष्कर्ष सही है। socket.recv एक अवरुद्ध कॉल है।

socket.recv(1024) अधिकतर 1024 बाइट्स पर पढ़ा जाएगा, अगर कोई डेटा पढ़ने की प्रतीक्षा नहीं कर रहा है तो अवरुद्ध हो जाएगा। यदि आप सभी डेटा नहीं पढ़ते हैं, तो socket.recv पर एक अन्य कॉल अवरुद्ध नहीं होगा।

socket.recv कनेक्शन बंद होने पर या कोई त्रुटि होने पर खाली स्ट्रिंग के साथ भी समाप्त हो जाएगी।

यदि आप एक गैर-अवरुद्ध सॉकेट चाहते हैं, तो आप चुनिंदा मॉड्यूल (सॉकेट का उपयोग करने से थोड़ा अधिक जटिल) का उपयोग कर सकते हैं या आप socket.setblocking का उपयोग कर सकते हैं।

मुझे अतीत में socket.setblocking के साथ समस्याएं थीं, लेकिन यदि आप चाहें तो इसे आजमाएं।

+0

मुझे अपने निष्कर्ष के बारे में कोई आधिकारिक विवरण नहीं मिला 3)। – redice

+0

socket.recv पढ़ेगा जब रिकॉर्ड्स को कॉल किया जाता है तो पढ़ने के लिए तैयार क्या होता है। इससे कोई फर्क नहीं पड़ता कि पढ़ी गई राशि अधिकतम आकार से कम है, जैसे ही डेटा डेटा पढ़ सके, सॉकेट अनब्लॉक हो जाएगा। – Martin

+1

यदि आप इसके लिए सही झंडा देते हैं तो आप रिकॉव() को अनब्लॉकिंग के रूप में भी कॉल कर सकते हैं: 'socket.recv (10240, 0x40) # 0x40 = MSG_DONTWAIT उर्फ ​​ओ_नॉनब्लॉक'कृपया ध्यान दें कि आपको ' [Errno 11 ] संसाधन अस्थायी रूप से अनुपलब्ध ' कोई इनपुट डेटा नहीं होने पर अपवाद। – Ray

4

यह वही व्यवहार होगा जैसा अंतर्निहित रिकिव libc कॉल व्यवहार के आधिकारिक वर्णन के लिए man page देखें (या सॉकेट एपीआई के general description को पढ़ें)।

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