0

シンプルなクライアント サーバー プログラムでは、クライアントは 12 バイトのデータを送信しています。recvfrom() を使用して、連続した呼び出しで 2 バイトと 10 バイトを要求しています。最初の呼び出しの場合、recvfrom() は 2 バイトを返します。しかし、2 番目の呼び出しがブロックされています。なぜそうなのか?連続した読み取り呼び出しが使用可能なバイト (ここでは 10) を返す TCP ソケットでは発生しないと思います。

4

2 に答える 2

5

man ページには、次の関連情報があります (太字が追加されています)。

SOCK_RAW、SOCK_DGRAM、SOCK_SEQPACKET などのメッセージベースのソケットの場合、メッセージ全体を 1 回の操作で読み取る必要があります。メッセージが長すぎて提供されたバッファに収まらず、フラグ引数に MSG_PEEK が設定されていない場合、余分なバイトは破棄されます。

1 回の呼び出しでそれを読み取る必要があります。

于 2013-02-11T18:20:05.497 に答える
1

lenrecvfrom 関数の 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 バイトは破棄されます ( recvfromman ページを見てください) 。

于 2013-02-11T18:29:22.587 に答える