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
Python 当网络套接字始终可以读取时,如何使用select?_Python_Sockets_Select - Fatal编程技术网

Python 当网络套接字始终可以读取时,如何使用select?

Python 当网络套接字始终可以读取时,如何使用select?,python,sockets,select,Python,Sockets,Select,我像这样使用选择: while True: readReady, _, _ = select.select([src, dst], [], []) for ready in readReady: if ready == dst: toRead = dst toWrite = src else: toRead = src toWrite = dst

我像这样使用
选择

while True:
    readReady, _, _ = select.select([src, dst], [], [])
    for ready in readReady:
        if ready == dst:
            toRead = dst
            toWrite = src
        else:
            toRead = src
            toWrite = dst

        toWrite.sendall(toRead.recv(10))
如果
toWrite
阻塞直到发送所有数据,这并不重要。但是问题是
select
会立即返回,因为套接字在没有数据的情况下就可以读取了。我该如何等待,直到实际有一些数据


另外,
print(toRead.recv(10))
prints
b''
是空的(而我希望
select
可以阻止)。套接字处于阻塞模式。

这是
select
API的一部分:如果
select
调用返回一个可读的套接字,则必须在其上调用
recv()
,否则以后每次调用select都会将此套接字作为仍然可读的套接字返回


如果您
recv()
且未获得任何数据,则这表示套接字已关闭。

recv
返回
b''
时,套接字处于“EOF”:读取将永远不会阻塞且始终不返回任何内容。因此,
select
表示读取不会阻塞(不会阻塞),您应该读取并注意输入条件的结束,并采取适当的措施(如果只是为了读取,可能关闭套接字;可能只是停止读取选择)。@torek您是对的,您应该将其作为答案发布:)谢谢