現在TCPの通信プログラムをC++で書いています。
構造体のvectorの通信で渡したいのですが、メモリ参照エラーになってしまいます。
物理的にメモリを共有していないため、渡すことは不可能なのでしょうか?
ご教授願います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
こんにちは。
std::vectorのデータは、データを記録している領域へのポインタを内部で保持しています。
もし、std::vector<int> x;
の &xからsizoef(x)バイトを送った場合、ポインタやデータの要素数等の管理領域だけが送られます。つまり、ポイント先の肝心のデータそのものが送られていません。また、ポインタに記録されているアドレスは送った先のコンピュータでは意味のないデータです。
したがって、&xを送信するような方法では送れません。
そのためには、シリアライザと呼ばれるライブラリを使うのが便利です。boost::serializationが一番有名と思います。cerealというヘッダオンリのお手軽そうなシリアライザもあります。実は私も作っています。ポインタを含む複雑なデータをTCP/IP通信で送受信するが参考になると思います。
投稿2018/10/14 18:42
総合スコア23272
0
別の方の回答が正しいです。少しだけ補足します。
TCPの生ソケット通信で、独自プロトコル、と考えます。vectorの内容をそのまま渡すことはできません。
vector::data()の内容をそのままバイト列として渡すことはできます。ただし、受け取ったそのバイト列を、そのまま同じvectorにキャストしても使うことは出来ない場合があります。
・アラインが異なる場合
→メモリ上の配置が異なるため
・エンディアンが異なる場合
→メモリ上の配置が異なるため
・構造体のメンバにポインタが含まれる場合
→実体が転送されていないため
なので、通常構造体の全メンバは入れ子になっている部分も含め、自分で決めたフォーマットでシリアライズしてから、転送することになります。
投稿2018/10/14 19:55
総合スコア343
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/17 07:25
0
既に他の方も書かれていますが、vectorはそのままでは、送る事ができません。シリアル化するなどの方法が必要となります。
便利なシリアル化ライブラリもあるようですが、シンプルには、先頭データから、構造体の要素を一つずつ、文字列または、バイト列として、送信し、受信側は、受け取った順に元の vectorデータを作成する必要があります。(受け取り側は逆の処理を行う)
複雑な構造体ならば、便利なライブラリを使うのもありですが、簡単に構造体ならば、自分で、個々の要素を一つずつ送るのもありと考えます。
この辺の処理は分かるでしょうか?
投稿2018/10/16 13:17
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。