python - 非阻塞套接字,错误总是

标签 python sockets

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

以上所有代码都在一个循环中。使用非阻塞套接字(只是想测试“非阻塞套接字”)来获取数据。但总是打印'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模块通常是要走的路。

关于python - 非阻塞套接字,错误总是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11647046/

相关文章:

C++:如何测量非阻塞套接字上的实际上传速率

python - 如何使用 py2exe 减小 exe 的大小

python - 文件中的递归键值

python - 使用python将数据从xml存储到数据库

python - 如何为以下内容写图归约

winsock - BSD socket 的双工

python - 文本:更改值后 UI 未更新

Java TCP/IP 聊天室,如何使其通过互联网工作

linux - 在 centos 7 上同步确认后的 socket 鳍

android - Android与WebSocket的连接挂起