非blockigUDPソケットからrecv()/ recvfrom()が何を返すかを理解するのに問題があります。
TCPと比較してもう少し具体的です(私が間違っている場合は訂正してください):
ブロッキングソケット(TCPまたはUDP)は、バッファにデータが存在するまで、recv()から戻りません。これは、バイト数(TCP)または完全なデータグラム(UDP)である可能性があります。
非ブロッキングTCPソケットは、EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(windows)または現在バッファーにあるバイトのいずれかを返します。TCPデータはストリームであるため、返されるバイト数は関係ありません。
今の質問:
- 利用可能なデータがない場合、非ブロッキングUDPソケットはWOULDBLOCK(linux)/ WSAEWOULDBLOCK(windows)も返します。しかし、利用可能なデータがある場合、非ブロッキングUDPソケットはほんの数バイトを返しますか?つまり、データグラムの半分しか取得できないのでしょうか、それともUDPソケットは常に完全なデータグラムを返すのでしょうか?
編集:
「データグラムの半分」とは、ソケットが現在データグラムを受信している瞬間にrecv()を呼び出すとどうなるかということです。その瞬間、バッファにいくつかのバイトがありますが、データグラムはまだ完成していません。
説明やコメントをいただければ幸いです。ありがとう!