質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

4回答

5483閲覧

構造体のvectorを通信で渡す方法について

nozomin_jp

総合スコア13

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

0クリップ

投稿2018/10/14 16:50

現在TCPの通信プログラムをC++で書いています。
構造体のvectorの通信で渡したいのですが、メモリ参照エラーになってしまいます。
物理的にメモリを共有していないため、渡すことは不可能なのでしょうか?

ご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

こんにちは。

std::vectorのデータは、データを記録している領域へのポインタを内部で保持しています。
もし、std::vector<int> x;の &xからsizoef(x)バイトを送った場合、ポインタやデータの要素数等の管理領域だけが送られます。つまり、ポイント先の肝心のデータそのものが送られていません。また、ポインタに記録されているアドレスは送った先のコンピュータでは意味のないデータです。
したがって、&xを送信するような方法では送れません。

そのためには、シリアライザと呼ばれるライブラリを使うのが便利です。boost::serializationが一番有名と思います。cerealというヘッダオンリのお手軽そうなシリアライザもあります。実は私も作っています。ポインタを含む複雑なデータをTCP/IP通信で送受信するが参考になると思います。

投稿2018/10/14 18:42

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

別の方の回答が正しいです。少しだけ補足します。

TCPの生ソケット通信で、独自プロトコル、と考えます。vectorの内容をそのまま渡すことはできません。
vector::data()の内容をそのままバイト列として渡すことはできます。ただし、受け取ったそのバイト列を、そのまま同じvectorにキャストしても使うことは出来ない場合があります。

・アラインが異なる場合
→メモリ上の配置が異なるため
・エンディアンが異なる場合
→メモリ上の配置が異なるため
・構造体のメンバにポインタが含まれる場合
→実体が転送されていないため

なので、通常構造体の全メンバは入れ子になっている部分も含め、自分で決めたフォーマットでシリアライズしてから、転送することになります。

投稿2018/10/14 19:55

wwbQzhMkhhgEmhU

総合スコア343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/10/17 02:35

> vector::data()の内容をそのままバイト列として渡すことはできます。ただし、受け取ったそのバイト列を、そのまま同じvectorにキャストしても使うことは出来ない場合があります。 vector::data()はvectorが管理する要素配列(相当)のみを指しますから、同バイト列をvectorにキャストして動くことは100%無いでしょう。 シリアライズ処理では、要素データに加えて要素数などの"管理情報"も取り扱うために、期待通りにvectorデータとして送受信が可能になっています。
wwbQzhMkhhgEmhU

2018/10/17 07:25

確かにここでキャストと言うと間違いですね。すみません。サイズ指定前提で、意図としてはdata()へのメモリコピー/リード/特殊なアロケータ指定です。
guest

0

シリアライズしてから送って下さい。

投稿2018/10/14 19:34

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既に他の方も書かれていますが、vectorはそのままでは、送る事ができません。シリアル化するなどの方法が必要となります。

便利なシリアル化ライブラリもあるようですが、シンプルには、先頭データから、構造体の要素を一つずつ、文字列または、バイト列として、送信し、受信側は、受け取った順に元の vectorデータを作成する必要があります。(受け取り側は逆の処理を行う)
複雑な構造体ならば、便利なライブラリを使うのもありですが、簡単に構造体ならば、自分で、個々の要素を一つずつ送るのもありと考えます。

この辺の処理は分かるでしょうか?

投稿2018/10/16 13:17

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問