0

write()コマンドを使ってソケットに書き込んでみました。書き込む必要のあるデータは構造体タイプであり、データ型charintデータ型の両方の値が含まれています。しかし、サーバーソケットにデータを書き込むと、int変数の値が破損します。私は16777216いつものように価値を受け取っています。

私はSolaris機械から機械へと書いていLinuxます。Solarisは32ビットマシンでLinuxあり、64ビットマシンです。これは私の問題に影響を及ぼしますか?

サーバーとの間でeger値を渡すためにhtonl/ntohlとその逆を使用しました。intしかし、構造体タイプ全体をソケットに書き込んでいる場合、これをどのように使用できますか?誰かが私がこれを整理するのを手伝ってもらえますか?

PCHAR data = NULL;
int size = sizeof(WSMsg);
int retry = 10;
data = new char [sizeof(WSMsg)];
memcpy(data, msg, sizeof(WSMsg));
int n = write(fd, &data[0], size);

これは私のコード部分です。WSMsgこれは構造体タイプでありintcharタイプ値があります。

char数値、型の値を含むデータベーステーブルから特定の行を書き込んでいます。そして、私はこのように異なるテーブルの異なる行を書いています。したがって、htonl/を使用する必要がある場合ntohlは、これらの数値をすべてネットワークバイトに変換する必要があります。整数型の値を持つテーブルとその構造が20以上あるので、これらすべてを変換して送信するのは時間のかかる作業になります。

4

1 に答える 1

2

バイトオーダーに問題があるようです。これを解決するにはいくつかの方法があります: 1 つはシリアライゼーションを調べることです。つまり、送信する構造をバイト順の問題に依存しない形式に変換します。別の解決策は、構造のコピーを作成し、必要に応じて eg htons/を使用することです。htonl

WSMsg temp = *msg;
temp.someShortField = htons(temp.someShortField);
// etc.

もちろん、受信側では反対のことを行います。

于 2012-11-29T12:10:22.820 に答える