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ソケットはブロッキング モードです。

4

1 に答える 1

2

これはselectAPIの一部ですselect。call が読み取り可能なソケットを返す場合は、それを呼び出す必要がありますrecv()。そうしないと、その後の select の呼び出しはすべて、このソケットをまだ読み取り可能なものとして返します。

データが得られない場合recv()、これはソケットが閉じていることを示しています。

于 2013-10-16T18:47:46.613 に答える