「ソケットから読み取る: 少なくとも x バイトを取得することが保証されていますか?」という質問に対する単純な答えは、いいえです。これらのソケット メソッドのドキュメント文字列を見てください。
>>> import socket
>>> s = socket.socket()
>>> print s.recv.__doc__
recv(buffersize[, flags]) -> data
Receive up to buffersize bytes from the socket. For the optional flags
argument, see the Unix manual. When no data is available, block until
at least one byte is available or until the remote end is closed. When
the remote end is closed and all data is read, return the empty string.
>>>
>>> print s.settimeout.__doc__
settimeout(timeout)
Set a timeout on socket operations. 'timeout' can be a float,
giving in seconds, or None. Setting a timeout of None disables
the timeout feature and is equivalent to setblocking(1).
Setting a timeout of zero is the same as setblocking(0).
>>>
>>> print s.setblocking.__doc__
setblocking(flag)
Set the socket to blocking (flag is true) or non-blocking (false).
setblocking(True) is equivalent to settimeout(None);
setblocking(False) is equivalent to settimeout(0.0).
recv()
このことから、要求したバイト数を返す必要がないことは明らかです。また、 を呼び出しているsettimeout(10.0)
ため、 の有効期限が近づくと、すべてではなく一部のデータが受信される可能性がありrecv()
ます。その場合、recv()
読み取ったものを返します-これは、要求したよりも少なくなります(ただし、一貫して4バイト未満になる可能性は低いようです)。
datagram
あなたは、(コネクションレス) UDP ソケット (TCP ではない) を使用していることを意味する質問に言及しています。区別については、こちらで説明しています。投稿されたコードはソケットの作成を示していないため、ここでは推測することしかできませんが、この詳細は重要な場合があります。コードのより完全なサンプルを投稿していただけると助かります。
問題が再現可能な場合は、タイムアウトを無効にして (偶然にも処理していないようです)、問題が解決するかどうかを確認できます。