3

整数配列を受信して​​いる間、受信したデータのバイト数をチェックする必要があります。たとえば、長さ 100 の整数配列を受け取る場合:

int count = 0;
int msg[100];
while(count < 100 * sizeof(int)){
    count += read(fd, msg + count / sizeof(int), 100 * sizeof(int) - count);
}

これは正しい方法ですか?read() は sizeof(int) の倍数ではない値を返しますか? これが正しくない場合、整数配列を受け取る正しい方法は何ですか?

4

3 に答える 3

1

readあなたが要求したすべてのデータを返さない可能性があることは正しいです。ネットワークソケットに接続されている場合。read必ずしも sizeof(int) の倍数の値を返すとは限りません。この (手動の) データ受信方法を使用する場合は、おそらく sizeof(int)s (システムによっては 4 または 8) の代わりにバイト数をカウントすることをお勧めします。これを行うよりもさらに簡単なのは、Protocol Buffersのようなものを使用することです。これにより、パケットのデータ形式を定義し、それらをすばやく簡単にシリアライズ/デシリアライズできます。(単に整数配列を含むメッセージを定義し、protobuf に他のすべてを処理させます。)

于 2013-04-19T05:55:53.097 に答える
0

その通りです。 read が の倍数のサイズのデータ​​を返すという保証はありませんsizeof(int)。お届けできる最小サイズはchar. ネットワーク経由で整数を受信する際のエンディアンなど、他にも注意すべき問題があります (ネットワーク経由で整数を送信する場合にも当然当てはまります)。

これらの理由から、より簡単な解決策は、メッセージを保存するchar[]代わりにを使用しint[]、それを にコピーすることint[]です。効率が気になる場合は、コードの最適化について心配する前に、これがボトルネックであることを証明してください (コードのプロファイリングを行います)。

また、ネットワークを介してsending とrecving を行っている場合は、TCP などのプロトコルがストリームベースであることを認識してください。つまり、単に文字のストリームを送信するだけであり、メッセージの終わりを検出して必要に応じてフォーマットする何らかの方法を実装する必要があります。 . 一般的な 2 つの方法は、メッセージの長さをヘッダーとして送信するか、特殊文字を使用し'\n'てメッセージの終わりを知らせることです。また、配列を送信しているので、「|」のようなものを使用できます 要素を分離します。

したがって、メッセージの例は次のようになります: "1|100|239|23|\n"

于 2013-04-19T06:46:33.080 に答える