2013-10-16 31 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()並且沒有獲取數據,那麼這是一個封閉套接字的指示。