テストから、次の3つの場合にsocket.recv(recv_size)
が返されると結論付けました。
接続が閉じられた後。たとえば、クライアント側でsocket.close()と呼ばれるか、ソケットエラーが発生すると、空の文字列が返されます。
データの中には、データのサイズがrecv_size
を超えるものがあります。
recv_size
より小さいので、少し時間が経ってもそれ以上データは来ません(0.1sが機能することがわかりました)。#3の詳細:
#server.py
while True:
data = sock.recv(10)
print data, 'EOF'
#client1.py
sock.sendall("12345")
sock.sendall("a" * 50)
#client2.py
sock.sendall("12345")
time.sleep(0.1)
sock.sendall("a" * 50)
client1.py
を実行すると、server.py
がエコーします。
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF
client2.py
を実行すると、server.py
がエコーします。
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
私の結論は正しいですか? #3に関する公式の説明はどこで見ることができますか?
はい、あなたの結論は正しいです。 _socket.recv
_はブロッキング呼び出しです。
socket.recv(1024)
は最大1024バイトを読み取り、読み取り待ちのデータがない場合はブロックします。すべてのデータを読み取らないと、_socket.recv
_への他の呼び出しはブロックされません。
_socket.recv
_は、接続が閉じられるかエラーが発生した場合も空の文字列で終了します。
ノンブロッキングソケットが必要な場合は、selectモジュール(ソケットを使用するよりも少し複雑)を使用するか、_socket.setblocking
_を使用できます。
過去に_socket.setblocking
_で問題が発生しましたが、必要に応じて試してみてください。
あなたの結論は正しいが、正確ではないと思います。
docs が示すように、socket.recv
は主にネットワークバッファーに焦点を当てています。
ソケットがブロックされている場合、socket.recv
は、ネットワークバッファーにバイトがある限り返されます。ネットワークバッファ内のバイトがsocket.recv
で処理できる以上の場合、処理可能な最大バイト数を返します。ネットワークバッファーのバイト数がsocket.recv
で処理できない場合、ネットワークバッファーのすべてのバイトが返されます。