6

recvfromを介してパケットの一部を受信しようとしています。実際には次のように機能します。

recvfrom(sockfd, serialised_meta, 12, flags, src_addr, addrlen);
recvfrom(sockfd, serialised_buf, BUFLEN, flags, src_addr, addrlen);

データは次のように送信されます。

 bufd->Serialise(serialised_buf, BUFLEN+12);
 sendto(sockfd, serialised_buf, BUFLEN+12, flags, dest_addr, addrlen);

したがって、アイデアは、最初にいくつかのメタデータを読み取り、次に何か他のものを受け取るかどうかを決定することです。問題は、2番目のバッファ(serialised_buf)の場合、最初に4'/0'バイトを受け取ることです。シリアル化の問題ではないようです。以前はシリアル化を使用していましたが、パケット全体(メタとデータ)を一度に受信している間、すべてがクールでした。それをどのように修正できるかについてのアイデアはありますか?

PS。不要なバイトをスキップできることは理解しています)しかし、とにかく、なぜそれが起こっているのでしょうか?

4

2 に答える 2

14

UDP は「ストリーム」プロトコルではありません...最初の recvfrom を実行すると、残りのパケットは破棄されます。2 番目の recvfrom は次のパケットを待っています...

于 2012-11-09T23:35:50.910 に答える
3

UDP は、TCP のようなストリームではなく、メッセージを操作します。UDP を使用する場合、と の間には 1 対 1 の関係がsendto()あります。recvfrom()UDP で部分的なデータを受信するオプションはありません。これはオール オア ナッシング タイプのトランスポートです。recvfrom()一度にメッセージ全体を確認してからBUFLEN+12、実際に使用するかどうかを決定します。それがUDPの仕組みです。

于 2012-11-10T04:09:16.320 に答える