5

LinuxでberkleysockerAPIを使用してCを使用してx86アーキテクチャで開発されたTCPサーバーがあります。サーバーは問題なく正常に動作します。しかし、今はいくつかの理由で、アーキテクチャを備えたMIPSアーキテクチャでサーバーを実行する必要がありますbig-endian

サーバーとクライアントは、事前定義されたプロトコルのセットを介して通信します。サーバーがクライアントに簡単なメッセージを送信する方法の例を示します。

struct echo_req req;

  req.header.version = OFP_VERSION;
  req.header.type = OFPT_ECHO_REQUEST;
  req.header.length = htons (sizeof req);
  req.header.xid = htonl(y);
  req.data = htonl (456);

char data[sizeof (req)];
data[0] = req.header.version;
data[1] = req.header.type;
memcpy (data + 2, &req.header.length, 2);
memcpy (data + 4, &req.header.xid, 4);
memcpy (data + 8, &req.data, 4);

  if ((send (sock_fd, &data, sizeof (data), 0) == -1))
    {
      printf ("Error in sending echo request message\n");
      exit (-1);
    }
printf("Echo Request sent!\n");

ご覧のとおり、ネットワークのバイトオーダーに変換するために、バイトより長いタイプを使用htonlしています。htonsパケットを作成した後、データをシリアル化してchar配列にパックし、最後にネットワークに送信します。

サーバーをビッグエンディアンアーキテクチャで実行する前に、いくつかのことをクリアしたいと思いました。私memcpyがデータをパックするときの私の認識では、memcpyがデータのバイトごとのコピーを配列に実行するため、ネットワーク経由で送信しても、ビッグエンディアンアーキテクチャで問題が発生することはありません。ビッグエンディアンで実行する場合、バイト順序に問題はありません。それでも、私はまだネットワークプログラミングの初心者なので、私よりも多くのことを知っていると思われる人々の意見を聞きたかったのです:)。私が正しい方向に進んでいるかどうかにかかわらず、これを案内してください。すべてが大いに感謝するのに役立ちます。

ありがとう

4

2 に答える 2

3

はい、memcpy送信元から宛先に順番にバイトをコピーするだけです。

コードの残りの部分を見ずに、必要な場所でhton(l | s)を使用したとは言えません。エンディアンの問題とは関係なく、浮動小数点数をバイト単位でコピーするようなことをした可能性もありますが、これは必ずしも機能するとは限りません。

ただし、上記で投稿したコードに明らかな問題は見られません。

于 2012-04-27T21:08:07.143 に答える
0

データを受信するときにもntoh/ntosを使用していることを確認しましたか?

ところで、データを送信するために構造体を使用する必要があります。それを文字配列に再アセンブルすると、CPU時間がかかり、エラーが発生する可能性があります。

于 2012-04-27T21:48:05.330 に答える