Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非阻塞套接字,错误总是_Python_Sockets - Fatal编程技术网

Python 非阻塞套接字,错误总是

Python 非阻塞套接字,错误总是,python,sockets,Python,Sockets,以上所有代码都在一个循环中。使用非阻塞套接字(只想测试“非阻塞套接字”)获取数据。但总是打印“EWOULDBLOCK”,我不知道为什么 异常是由设计引发的,因为您使用的是非阻塞IO 主要的机械差异是发送、接收、连接和接受可以在不做任何事情的情况下返回。你(当然)有很多选择。你可以检查返回码和错误码,这通常会让你发疯 引自 如果运行man errno 3,您将看到eWoldBlock的说明。这个例外是合理的,因为还没有数据可以读取 套接字是非阻塞的,因此如果没有可读取的数据,recv()将引发异常

以上所有代码都在一个循环中。使用
非阻塞套接字
(只想测试“非阻塞套接字”)获取数据。但总是打印“EWOULDBLOCK”,我不知道为什么

异常是由设计引发的,因为您使用的是
非阻塞IO

主要的机械差异是发送、接收、连接和接受可以在不做任何事情的情况下返回。你(当然)有很多选择。你可以检查返回码和错误码,这通常会让你发疯

引自


如果运行
man errno 3
,您将看到
eWoldBlock
的说明。这个例外是合理的,因为还没有数据可以读取

套接字是非阻塞的,因此如果没有可读取的数据,
recv()
将引发异常。请注意,errno.ewoldblock=errno.EAGAIN=11。这是Python(实际上是操作系统)告诉您稍后再尝试
recv()
的方式

我注意到,每次出现此异常时,都会关闭套接字。那根本没用。您的代码应该是这样的:

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

对于这类事情,模块通常是最好的选择。

添加所有代码,包括设置套接字以及运行的Python版本和操作系统。作为参考:
OS.strerror(e.args[0])
将打印错误字符串。谢谢。我发现问题是我错过了
时间。睡眠(1)
。没有它,打印的都是“EWOULDBLOCK”。那么为什么“没有紧循环”是必不可少的呢?@zhenyuyang我不理解“我错过了”,但紧循环只是浪费了CPU周期,因为它可以做其他事情,比如运行其他线程或进程。如果您一直在获取EWoldblock,则没有数据可读取。如果您不想出现这种情况,为什么要使用非阻塞模式?
socket.timeout
异常在这里重要吗?@cmcdragokai:不,不会发生超时异常,因为socket是非阻塞的。如果需要超时,请使用
socket.settimeout()
,然后处理任何
socket.timeout
异常。或者,通常更好的方法是使用
select()/poll()
来监视套接字。
socket.timeout
是否也与特定的
errno.?
,如果您想用
socket.error
异常处理程序捕获它?
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