2016-07-19 48 views
-1

TCP経由でデータを送受信しようとしています。私の問題は、1つのTCPメッセージで2つの構造体を送信したいのです。構造体をリンクする方法はありますか? のような何か:C++、tcp経由で構造体を送信する

send(connected, struct1 + struct2, sizeof(struct1 + struct2), 0); 

recv_data = recv(connected, struct1 + struct2,sizeof(struct1 + struct2),0); 

のようなメッセージが何かの先頭で信号バイトを追加することが可能であろうでない場合は、次の

send(connected, "0x01" + struct1, sizeof(struct1 + 1), 0); 

recv_data = recv(connected, struct1,sizeof(struct1),0); 
+0

参照std :: vector :: data –

+1

いいえ、いいえ、いいえ、いいえ。 'sizeof(vector)'は、ベクトルの内容が何バイトを占めているかは分かりません。あなたがやっていることをやめ、それについて考える。 –

+0

私は何かを忘れてしまった、私は構造体について話している。投稿を編集しました。 – tascapone

答えて

0

あなたが許可writevreadv機能、に見ることができます複数の非連続メモリ位置を有するデータの送受信。

struct iovec data[2]; 
data[0].iov_base = vector1.data(); 
data[0].iov_len = vector1.length() * sizeof(vector1[0]); 
data[1].iov_base = vector2.data(); 
data[1].iov_len = vector2.length() * sizeof(vector2[0]); 
writev(socket, data, 2); 

しかし、受信側では、受信する要素の数を知るための方法が必要であるため、読み込むための十分な領域を確保する必要があります。

これは、複写可能なオブジェクトのベクトルにのみ適用され、std::vector<std::string>のようなものではありません。

実際には、ベクトルからソケットへの生のバイトをコピーするだけでなく、適切に設計されたシリアル化フォーマットを定義する必要があります。

これを正しく行う方法がわからない場合は(疑似コードでは示唆しない場合)、Protocol Buffersのようなものを見てください。

編集: [OK]を「ベクトル」と繰り返し言いながらも、ベクトルについては言及していません。些細な種類のシンプルな構造体のためにあなたがそれを行うことができます。

struct iovec data[2]; 
data[0].iov_base = &struct1; 
data[0].iov_len = sizeof(struct1); 
data[1].iov_base = &struct2; 
data[1].iov_len = sizeof(struct2); 
writev(socket, data, 2); 

しかし、あなたはまだだけに生のバイトをコピーするべきではありません/ソケットから。これは、送信側と受信側のマシンがデータ型のサイズ、アラインメント、エンディアンに合意している場合にのみ機能します。プロトコルバッファのような適切に設計されたシリアライゼーションシステムを使用することは、より安全で正確です。これは、これらのことを正しく安全に行う方法を理解している人々によって設計されています。

+0

私は何かを逃した、私は構造体について話しています。投稿を編集しました。 – tascapone

+0

この方法私はデータを送信することができますが、受信側で私は間違ったデータを受信します。 – tascapone

+0

**適切に設計されたシリアライズフォーマットを使用してください!**そうでなければ、オブジェクトレイアウトに関するあらゆる種類の安全ではない仮定があります。 –

関連する問題