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