9

質問があります。

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

`

#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];
}

`

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

その後、ソケットを使用してクライアントとサーバー間の接続を開きます。問題は、このオブジェクトをサーバーからクライアントに、またはその逆に送信するにはどうすればよいかということです。私を手伝ってくれますか?

4

3 に答える 3

16

文字通りの意味で TCP 接続を介してオブジェクトを送信することは不可能です。ソケットは、バイト ストリームを送受信する方法しか認識していません。したがって、TCP接続を介して一連のバイトを送信し、受信プログラムがそれらを解釈して、送信プログラムが送信したいものと同じオブジェクトを作成する方法を知っているようにフォーマットします。

そのプロセスはシリアライゼーション (および受信側のデシリアライゼーション) と呼ばれます。シリアル化は C++ 言語自体に組み込まれていないため、シリアル化を行うにはコードが必要になります。これは手動で、XML を使用して、または Google のプロトコル バッファを介して、またはオブジェクトを人間が読めるテキストに変換してテキストを送信することによって、または他の多くの方法のいずれかによって行うことができます。

詳細については、こちらをご覧ください。

于 2013-08-29T17:11:03.783 に答える
3

シリアル化を使用してこれを行うことができます。これは、ソケットを介してこれらの要素を送信できるように、オブジェクトを分割することを意味します。次に、接続の反対側でクラスを再構築する必要があります。Qt には、そのような機能を提供するQDataStream クラスがあります。QByteArray と組み合わせて、送信可能なデータ パッケージを作成できます。アイデアは簡単です:

送信者:

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);
};

拡張例

于 2013-08-29T17:13:07.050 に答える
0

これでどれだけの高射砲が得られるかわかりませんが、これを試してみましたが、共有する必要があります. 私はソケットプログラミングの初心者なので、怒らないでください。

私がしたことは、クラスのサイズ (サーバー側のメモリ ブロックを表す) の文字の配列を作成したことです。次に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;

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

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

PS: 私がやったことはコーディングの方法が悪いと思われる場合は、その理由を教えてください。なぜこれがそんなに悪い考えなのかわかりません(実際にこれを行うのが悪い考えである場合)。ありがとう!!

于 2017-02-12T20:22:18.987 に答える