C ++ソケットを介してオブジェクトを送信するにはどうすればいいですか? -- c++ フィールド と sockets フィールド と tcp フィールド と send フィールド と recv フィールド 関連 問題

C++ How can I send an object via socket?












8
vote

問題

日本語

あなたに質問があります。

このクラスを持っています:

<事前> <コード> #define DIMBLOCK 128 #ifndef _BLOCCO_ #define _BLOCCO_ class blocco { public: int ID; char* data; blocco(int id); }; #endif blocco::blocco(int id) { ID = id; data = new char[DIMBLOCK]; }

とアプリケーションにはクライアントとサーバーがあります。 サーバーのメインで、このようにしてこのクラスのオブジェクトをインスタンス化します。 Blocco A(1);

その後、私はクライアントとSocketsを使用してサーバー間の接続を開きます。 問題は次のとおりです。このオブジェクトをサーバーからクライアントまたはviceversaに送信できますか? あなたは私を助けてもらえますか?

英語

I have a question for you.

I have this class:

`

#define DIMBLOCK 128 #ifndef _BLOCCO_ #define _BLOCCO_  class blocco {     public:         int ID;         char* data;           blocco(int id); };  #endif     blocco::blocco(int id) {     ID = id;     data = new char[DIMBLOCK]; } 

`

and the application has a client and a server. In the main of my server I instantiate an object of this class in this way: blocco a(1);

After that I open a connection between the client and the server using sockets. The question is: how can I send this object from the server to the client or viceversa? Could you help me please?

</div
              
 
 

回答リスト

14
 
vote
vote
ベストアンサー
 

文字通りの意味でTCP接続を介してオブジェクトを送信することは不可能です。ソケットはバイトのストリームを送受信する方法を知っています。したがって、受信プログラムがそれらを解釈する方法を知って送信したいオブジェクトを作成し、送信したいオブジェクトを作成する方法でフォーマットされた方法でフォーマットされたTCP接続に従って、TCP接続にわたる一連のバイトを送信することです。その処理はシリアライゼーション(受信側の逆シリアライゼーション)と呼ばれます。シリアル化はC ++言語自体に組み込まれていないため、実行するコードが必要になります。それは手で行うか、またはXML、またはGoogleのプロトコルバッファを介して、またはそのオブジェクトを人間が読めるテキストに変換してテキストを送信し、他のいくつかの方法を送信することによって行うことができます。

は、 詳細については / P>

 

It's impossible to send objects across a TCP connection in the literal sense. Sockets only know how to transmit and receive a stream of bytes. So what you can do is send a series of bytes across the TCP connection, formatted in such a way that the receiving program knows how to interpret them and create an object that is identical to the one the sending program wanted to send.

That process is called serialization (and deserialization on the receiving side). Serialization isn't built in to the C++ language itself, so you'll need some code to do it. It can be done by hand, or using XML, or via Google's Protocol Buffers, or by converting the object to human-readable-text and sending the text, or any of a number of other ways.

Have a look here for more info.

</div
 
 
     
     
3
 
vote

シリアライゼーションを使用してこれを行うことができます。これは、オブジェクトをピースに引っ張ることを意味します。次に、接続のもう一方の端末にクラスを再構築する必要があります。 QTでは、 Qdatastream Class

送信者:

<事前> <コード> QByteArray buffer; QDataStream out(&buffer); out << someData << someMoreData;

受信機:

<事前> <コード> QByteArray buffer; QDataStream in(&buffer); in >> someData >> someMoreData;

今すぐ追加コンストラクタを提供したい場合があります。

<事前> <コード> class blocco { public: blocco(QDataStream& in){ // construct from QDataStream } //or blocco(int id, char* data){ //from data } int ID; char* data; blocco(int id); };

拡張例

 

you can do this using serialization. This means pulling object into pieces so you can send these elements over the socket. Then you need to reconstruct your class in the other end of connection. in Qt there is QDataStream class available providing such functionality. In combination with a QByteArray you can create a data package which you can send. Idea is simple:

Sender:

QByteArray buffer; QDataStream out(&buffer); out << someData << someMoreData; 

Receiver:

QByteArray buffer; QDataStream in(&buffer); in >> someData >> someMoreData; 

Now you might want to provide additional constructor:

class blocco {     public:         blocco(QDataStream& in){             // construct from QDataStream         }          //or         blocco(int id, char* data){             //from data         }         int ID;         char* data;           blocco(int id); }; 

extended example

</div
 
 
0
 
vote

私はどれだけのFlakがこれにどのくらいわからないが、私はこれを試してみましたが、それを共有するべきです。私はソケットプログラミングで初心者ですので怒ってしまいません。

私は何をしたのか私はクラスのサイズの一連の文字(サーバー側のメモリのブロックを表す)を作成しました。その後、クライアント側のメモリのブロックとオブジェクトとしてのメモリのブロックとVoilaとしてのメモリのブロックを使用しています!!! i <コード> recv 私はクライアントからサーバーにオブジェクトを送信することができました。

サンプルコード:

<事前> <コード> blocco *data; char blockOfData[sizeof(*data)]; if(recv(serverSocket, blockOfData, sizeof(*data), 0) == -1) { cerr << "Error while receiving!!" << endl; return 1; } data = (blocco *)blockOfData;

これを使ってこのデータを使用してオブジェクトへのポインタとしてすることはできます。このメモリがスタック上のアレイBlackOfDataに割り当てられているため、このポインタを削除/解放しようとしないでください。

これがこのようなものを実装したいのであれば、これが役立つことを願っています。

PS:私がやったことを考えているのであれば、符号化のやり方があるのは理由を教えてください。私はなぜこれがそのような悪い考えであるのかわかりません(それが実際にこれをするのが悪い考え方であるならば)。ありがとう!!

 

I don't know how much flak I'll get for this, but well I tried this and though I should share it. I am a beginner at socket programming so don't get pissed off.

What I did is I created an array of characters which is of the size of the class (representing the block of memory at the server side). Then I recved the block of memory at the client side and typecast that block of memory as an object and voila!! I managed to send an object from client to server.

Sample code:

blocco *data; char blockOfData[sizeof(*data)];  if(recv(serverSocket, blockOfData, sizeof(*data), 0) == -1) {     cerr << "Error while receiving!!" << endl;     return 1; }  data = (blocco *)blockOfData; 

Now you can do whatever you want with this data using this as a pointer to the object. Just remember do not try to delete/free this pointer as this memory is assigned to the array blockOfData which is on the stack.

Hope this helps if you wanted to implement something like this.

PS: If you think what I've done is poor way of coding please let me know why. I don't know why this is such a bad idea(if it is in fact a bad idea to do this). Thanks!!

</div
 
 
       
       

関連する質問

0  Winsock Recvは10014エラーを与えます  ( Winsock recv gives 10014 error ) 
コードから始めます: <事前> <コード> typedef std::vector<unsigned char> CharBuf; static const int RCV_BUF_SIZE = 1024; SOCKET m_socket = a co...

0  TCPデータを処理するときに何を期待するか  ( What to expect when processing tcp data ) 
POSIX OS(VxWorks)を使用しており、TCPデータの処理方法を理解したい。私はUDPで理解していますすべてがあなた次第で、TCPはその下でもっと管理されています。 私がJSONデータを送るために約束するリモートソケットを考えてください。ドキュメン...

-1  Winsock Recv()ブロッキングクライアントアプリ  ( Winsock recv blocking clients app ) 
複数のユーザーがサーバーに接続できるように、単純なC ++ Server-Clientアプリケーションを作成しようとしています。問題は、クライアントごとに新しいスレッドを作成した後、RECV関数がクライアントアプリをクラッシュし始めました。 接続されている各ク...

0  チャンクなしでソケットRECVバッファサイズを設定します  ( Set socket recv buffer size without chunk ) 
私はCでソケットを発行しています パケットサイズは 3072 に設定されています。 <事前> <コード> int recvBuff = 3072; int recvLowAt = 2; if (setsockopt(sock,...

0  返されたヘッダーの文字列を検索します  ( Searching for string in returned header ) 
特定の情報のために返されたヘッダーを検索するのが難しいです。 s.recvから結果を印刷すると、フルヘッダーが表示されます。私は「サーバー」という言葉のために行ごとに行を検索しようとしましたが、これを行うことで1行に1文字が表示されました。このタスクに正規表現...

0  Python Socket - Send()コマンドは働きません  ( Python socket send command doesnt work ) 
私は4つのことをするサーバーとクリエットを書く必要があります 1.メッセージが記録された時間を求めます 2.フォルダ内のすべてのファイルを格納します 3.そのフォルダからファイルを入力し、別のフォルダに新しいファイル(TXT)を作成する 4. PROGEM を...

0  PythonはHTTPソケットサーバーでユーザーデータを受信できません  ( Python cant receive user data in http socket server ) 
Recv()でデータを取得できません ユーザーがフォームフィールドに入力したデータが コード: <事前> <コード> def recvall(self, conn): BUFF_SIZE = 4096 # 4 KiB data = "" ...

6  com.mysql.jdbc.exceptions.jdbc4.comMunicationSexception:通信リンク障害ソフトウェア接続中止:RECV失敗[重複]  ( Com mysql jdbc exceptions jdbc4 communicationsexception communications link fai ) 
この質問はすでにここで回答を持っています ソフトウェアの原因の接続アボート:ソケット書き込みエラー "< / a> (14回答) ...

0  C ++ SQLiteはいくつかの値を返しますか?  ( C sqlite return some values ) 
SQLiteを使用するサーバサイドプログラムをコーディングしています。クライアントがログインすると、 Userinfo 表から情報を取得します。 その列はです userno(int)、 お金(int)、 bankmoney(int)、 ジェンダー(文...

1  RECV()正しいC ++を使用します  ( Recv correct use c ) 
私はC ++で私自身のFTPクライアントに取り組んでいますが、関数 recv()に立ち往生しています。 RECV()でデータを取得すると、 tcp プロトコルを使用しているので、ループでRECVを使用する必要があるため、不完全な場合があります。問題は、受信する...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有