9

私は C でいくつかのソケット プログラミングを行っており、バイト オーダーの問題に取り組んでいます。リクエスト (送信) は問題ありませんが、データを受信するとバイトがすべて乱れます。私は次のようなことから始めます:

char * aResponse= (char *)malloc(512);
int total = recv(sock, aResponse, 511, 0);

この応答を処理するとき、各 16 ビット ワードのバイトが逆になっているようです (私は UDP を使用しています)。私は次のようなことをしてそれを修正しようとしました:

    unsigned short * _netOrder= (unsigned short *)aResponse;
    unsigned short * newhostOrder= (unsigned short *)malloc(total);
    for (i = 0; i < total; ++i)
    {
         newhostOrder[i] = ntohs(_netOrder[i]);
    }

これは、データを short として扱っている場合は正常に機能しますが、ポインターを char に再​​度キャストすると、バイトが逆になります。私は何を間違っていますか?

4

6 に答える 6

3

これは、データを short として扱っている場合は正常に機能しますが、ポインターを char に再​​度キャストすると、バイトが逆になります。

それが私が期待するものです。

私は何を間違っていますか?

送信者が何を送信したかを知る必要があります。データがバイト (反転する必要がない) なのか、ショートかロング (反転する必要がある) かを知る必要があります。

ntohshtons、およびhtonsAPIに関連するチュートリアルについては、Google 。

于 2009-02-08T17:15:02.263 に答える
2

aResponse(文字列? 構造体?)が何を表しているのかは明確ではありません。エンディアンは、s ではなく、数値にのみ関連しますchar。また、送信側で、すべての数値がホストからネットワークのバイトオーダーに変換されていることを確認する必要があります ( hton*)。

于 2009-02-08T17:15:52.403 に答える
1

元の質問 (既に回答されていると思います) とは別に、mallocステートメントを確認する必要があります。mallocはバイトを割り当て、unsigned short は 2 バイトである可能性が最も高いです。

ステートメントは次のようになります。

unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short));
于 2009-02-08T17:18:42.833 に答える
0

シングルバイトの場合、バイトの順序は気にしないかもしれません。

于 2011-06-30T11:59:48.930 に答える
0

ネットワーク バイト オーダーはビッグ エンディアンなので、意味を持たせたい場合はリトルエンディアンに変換する必要がありますが、それが単なる配列である場合は大騒ぎするべきではありません。送信者はどのようにデータを送信しますか?

于 2009-02-08T17:09:19.203 に答える