3

UDP ブロードキャスト経由でバイナリ データを受信するクライアント アプリケーションを C++ で作成していますが、バッファ サイズに関係なく、最初の 4 バイトを超えるデータを受信できません。Wireshark でパケットを確認したところ、マシンが約 1200 バイトのデータを受信して​​いることがわかります。これをクライアントが受信しているものと比較すると、パケットを取得していることがわかりますが、残りのデータは失われています。これが私のコードです:

#define BUFFERSIZE 4096
int main()
{
    struct addrinfo hints, *servinfo, *p;
    int sockfd, i, nbyt;

    int *buf = (int*) malloc(BUFFERSIZE);

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, "9011", &hints, &servinfo);

    sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
    bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen);

    FILE *file;
    file = fopen("file.txt", "w+");

    for (i=0;i<=45;i++)
    {
        nbyt = recv(sockfd, buf, BUFFERSIZE, 0);            
        fprintf(file, "%s %d; %s %x\n", "Bytes received:", nbyt, "Message:", *buf);
    }

    fclose(file);
    close(sockfd);
    free(buf);

    printf("%s\n", "Execution ended.");

    return 0;
}

私が受け取っているデータの例:

Bytes received: 1131; Message: 5b0
Bytes received: 1131; Message: 5b3
Bytes received: 1131; Message: 5b6
Bytes received: 1092; Message: 4e0

MSG_DONTWAIT同様のPythonアプリケーションの問題を修正したため、フラグを使用してソケットを非ブロックに設定しようとしましたが、これはエラーのみを返します:

Bytes received: -1; Message: 0

私は C++ とソケットに比較的慣れていないので、私が見ていないものがある可能性があります。うまくいけば、誰かが何が問題なのかを理解するのを手伝ってくれますか? 必要に応じて追加情報を提供できます。

4

3 に答える 3

4

ちゃんと受け取っています。あなたのデバッグコードは、あなたが思っていることをしていません。

unsigned int 引数を 16 進数で出力する指定子xprintfお使いのプラットフォームの整数は、おそらく 32 ビットです。したがって、最初の 4 バイトのみを印刷しています。

バッファ全体を 16 進数で出力したい場合は、ループを自分で書く必要があります (または、もちろんライブラリを使用します)。

たとえば、私の C は少し錆びていることを警告します (これは、これを実行するための最良の方法ではありません) ... また、これは、バッファーが常に sizeof(int) の倍数であると仮定しています。一部のデータが失われます:

nbyt = recv(sockfd, buf, BUFFERSIZE, 0);            
fprintf(file, "%s %d; %s\n", "Bytes received:", nbyt, "Message:");
for (offset = 0; offset < nbyt/sizeof(int); ++offset) {
    fprintf(file, "%x ", buf[offset]);
}
fprintf(file, "\n");
于 2013-01-03T21:05:48.660 に答える
1

*bufコードでは、受信したデータの配列の最初の整数を意味するため、受信したUDPペイロードの最初の4バイトだけを出力しています。

于 2013-01-03T21:13:27.160 に答える