2013-10-16 28 views
1

我用select这样的:如何使用网络套接字始终可以读取时选择?

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))打印b''这是空的(虽然我预计select阻止)。套接字处于阻塞模式。

+1

当'recv'返回'b'''时,套接字为“EOF”:读取将永远不会阻塞,并且总是不会返回任何内容。因此'select'表示读取不会阻塞(它们不会),并且您应该读取并记录输入结束条件并做适当的事情(也许关闭套接字,如果它仅用于读取;也许只是停止选择阅读)。 – torek

+0

@torek你说得对,你应该发布它作为答案:)谢谢btw – loolooyyyy

回答

2

这是select API的一部分:如果select调用返回一个可读的插座,则必须调用它的recv(),否则选择每个后续调用将返回此套接字依然清晰可辨。

如果recv()并且没有获取数据,那么这是一个封闭套接字的指示。