簡體   English   中英

非阻塞套接字,總是出錯

[英]non-blocking socket,error is always

sock.setblocking(0)
try:
    data = sock.recv(1024)
 except socket.error, e:
    if e.args[0] == errno.EWOULDBLOCK: 
          print 'EWOULDBLOCK'
else:            
   if not data:   #recv over
      sock.close()
      print 'close================='       
   else:
      print 'recv ---data---------'
      poem += data

所有上面的代碼都在循環中。 non-blocking socket (只是想測試'非阻塞套接字')來獲取數據。 但總是打印'EWOULDBLOCK',我不知道為什么?

套接字是非阻塞的,因此如果沒有要讀取的數據, recv()將引發異常。 請注意,errno.EWOULDBLOCK = errno.EAGAIN = 11.這是Python(實際上是操作系統)告訴您稍后再次嘗試recv()

我注意到每次出現此異常時都會關閉套接字。 這根本沒有幫助。 你的代碼應該是這樣的:

import socket, errno, time

sock = socket.socket()
sock.connect(('hostname', 1234))
sock.setblocking(0)

while True:
    try:
        data = sock.recv(1024)
        if not data:
            print "connection closed"
            sock.close()
            break
        else:
            print "Received %d bytes: '%s'" % (len(data), data)
    except socket.error, e:
        if e.args[0] == errno.EWOULDBLOCK: 
            print 'EWOULDBLOCK'
            time.sleep(1)           # short delay, no tight loops
        else:
            print e
            break

對於這種事情, select模塊通常是要走的路。

設計會引發異常,因為您使用non-blocking IO

主要的機械差異是send,recv,connect和accept可以在沒有做任何事情的情況下返回。 你(當然)有很多選擇。 您可以檢查返回代碼和錯誤代碼,通常會讓自己發瘋。

引自Python doc

如果你運行man errno 3 ,你將看到EWOULDBLOCK的描述。 這個例外是合理的,因為還沒有數據可供閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM