4

私は unix ソケットを使用しており、バッファーが char 型 (つまり、文字列の送受信) の場合にデータを send() および recv() できます。私は Beej のソケットに関するガイドを使用しました。使用された例は、文字列の送信/受信に関するものでした。

今、1 つのメッセージでさまざまな種類のデータを送受信したいと考えています。
たとえば、あるメッセージで整数、文字列、倍精度浮動小数点数を送信したいとします。これを行うにはどうすればよいですか?より具体的には、メッセージの「バッファ」はどのタイプにする必要がありますか?

send と recv のプロトタイプ:

int recv (int socket, void *buffer, size_t size, int flags)
int send (int socket, void *buffer, size_t size, int flags)

私は C/C++ とポインターの経験があまりないので、これはおそらく初歩的な質問です。

誰かが私を正しい方向に導くことができれば、本当に感謝しています。ありがとう

4

5 に答える 5

2

膨大な量のデータ (数キロバイト) を送信することを計画していない限り (1 秒あたり数パケット)、データを文字列に変換 (別名「データをシリアル化」) し、その方法で渡すことをお勧めします。これにはいくつかの利点があります。

  1. intそれは移植可能です -またはfloatまたはがどのようなサイズであっても機能doubleします - またはフィールド間のパディングが構造内にあります。
  2. デバッグは簡単です (データを見て、それが正しいか間違っているかを判断するだけです)。
  3. 送信/受信マシンのバイト順は関係ありません。

double一方、バイナリ データの送信は複雑です。データ フィールドの個々のサイズとその内部表現 (バイト順、バイナリでの表現方法、構造内のデータ フィールドのパディング、ポインタを渡すことができない)について心配する必要があるためです。など)。唯一の利点は、バイナリ データがもう少しコンパクトになることです。しかし、それはあなたが何キロバイトも持っているか、毎秒たくさんのパケットを送信している場合にのみ問題になります.

于 2013-03-01T23:54:36.923 に答える
2

送信側でオブジェクトをシリアライズし、受信側でデシリアライズする必要があります。C++ には、そのためのライブラリが多数あります。たとえば、Boost Serializationや、車輪を再発明したい場合は、いつでも独自のライブラリを転がすことができます。

于 2013-03-01T23:52:04.247 に答える
0

それは、これがどれだけ移植可能でなければならないかによって異なります。

最も簡単な方法は、すべてをコンマまたはセミコロンで区切られた ASCII に変換し、受信側で再度解析することです。

ネットワーク バイト オーダーに変換し、バイナリとして送信することもできます。

于 2013-03-01T23:52:45.653 に答える