2011-07-28 4 views
1

struct ss {int data; string name;} * o;C++を使用してWindowsプラットフォームのソケット通信で構造体を送信する方法

これはクライアントアプリケーションの私の構造です 私はそれをサーバ(TCPサーバのウィンドウ下)に送りたいと思います。 これを行う方法.. 私はserilizationが解決策であることを知っています。 しかし、私はそれを行う方法がわかりません。できれば助けてください。

答えて

2

http://www.parashift.com/c++-faq-lite/serialization.html

あなたはシリアル化のためのブーストを使用する場合は、Serialize and send objects by TCP using boost

この を読んで、私は通常、このデータを転送するための私自身のデータフォーマットを記述します。

文字バッファを作成します。

パケットのサイズを入れます。 整数をバイトに変換してコピーします。 文字列の長さを追加します。 という名前をコピーして送信します。

0

まず、クライアントとサーバーが常に同じアーキテクチャであるかどうかを知る必要があります。これにより、dataをそのまま送ることができるかどうか、エンディアンと整数のサイズを気にする必要があるかどうかが決まります。 いずれの場合も、ntohlhtonlはバイトオーダーを処理し、intを単純に定義された方法(すでにネットワークバイトオーダーのマシンではオペレーションなし)で転送することができます。

についてstringについては、文字列データが両側で同じエンコーディングになっていることを前提として、TCP上でサイズと内容の両方を正確に送信することができます(サイズをhtonlとする) UTF-8などのエンコードが常に使用されます。
両端のマシンが使用しているエンコーディングがわからない場合は、困っています。その場合、にはに、これを定義し、それに応じて変換するメッセージが含まれている必要があります(例:webserversと同様です)。

TCPを「通常モード」で動作させると、Nagleのアルゴリズムが有効になるため、sendを3回呼び出すことができます。ネットワークレイヤーはこれを妥当な数のパケットに強制します整数のためだけの個々のパケット)。

あなたの例の単純なケースでは、すべて、または適切なシリアル化を実行することができます。これは、はるかに多くの作業です。

+0

私はhtonlとntohlをしました。 – Dharma

0

これは非常に良いガイドです:http://beej.us/guide/bgnet/output/html/multipage/index.html。それは厳密にはウィンドウではありませんが、変更はごくわずかです。

基本的にデータをバッファにシリアル化してからsend関数を使用する必要があります。あなたのソケット識別子とバッファ等を渡す...SOCKET S __in

int send(

、CONSTするchar * BUF __in 、 __in INT LEN、 __inのINTフラグ )。 http://msdn.microsoft.com/en-us/library/ms740149(v=vs.85).aspx

0
// send some data to a socket 
send( 
    socket,  // the open socket 
    o,    // pointer to the data 
    sizeof(ss), // number of bytes 
    0);   // no special flags 

難しさから

は、もう一方の端にあります!受信者は、読み取るバイト数とそれらを格納する構造体を知る必要があります。

これらの問題に対処する独自のコードを作成するか、ソケットの上で動作するプロトコルを使用する必要があります。コードは難しくはありませんが、利用可能なプロトコルのいくつかの経験は、問題を解決するのに役立ちます!

関連する問題