シンプルなクライアント サーバー プログラムでは、クライアントは 12 バイトのデータを送信しています。recvfrom() を使用して、連続した呼び出しで 2 バイトと 10 バイトを要求しています。最初の呼び出しの場合、recvfrom() は 2 バイトを返します。しかし、2 番目の呼び出しがブロックされています。なぜそうなのか?連続した読み取り呼び出しが使用可能なバイト (ここでは 10) を返す TCP ソケットでは発生しないと思います。
質問する
3516 次
2 に答える
5
man ページには、次の関連情報があります (太字が追加されています)。
SOCK_RAW、SOCK_DGRAM、SOCK_SEQPACKET などのメッセージベースのソケットの場合、メッセージ全体を 1 回の操作で読み取る必要があります。メッセージが長すぎて提供されたバッファに収まらず、フラグ引数に MSG_PEEK が設定されていない場合、余分なバイトは破棄されます。
1 回の呼び出しでそれを読み取る必要があります。
于 2013-02-11T18:20:05.497 に答える
1
len
recvfrom 関数の 3 番目の ( ) パラメータについて混乱していると思います。
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
void *buf
後者は、パケットから抽出するバイト数ではなく、バッファ ( ) の大きさを示します。
UDP
タイプソケットでは、他のピアが送信したパケット全体を読み取る必要があり (断片化されUDP
ていないことを確認してください)、TCP
モードと同様に送信されたデータの複数の読み取りを回避する必要があります。
あなたの場合、バッファが 2 バイトの場合、残りの 10 バイトは破棄されます ( recvfrom
man ページを見てください) 。
于 2013-02-11T18:29:22.587 に答える