2

ベクトルは、ベクトルの内部データが実際に保存されている場所を指している可能性がある独自の種類のデータで表されているように見え、アクセス方法がわからないため、enet 接続を介してベクトルを送信する際に問題が発生しています。

クライアントとサーバーの両方に、次のデータ構造があります。

typedef struct {
    unsigned int type;
    vector<int> content;
} packetFormat;

データは次のようにサーバーに送信されています。

packetFormat var;
var.type = 5; //sizeof is 4 bytes
var.content = {1, 3, 5, 20, 10, 50, 10, 10}; //sizeof is 16 bytes regardless of data
//total 20 bytes, 21 counting \0 character
ENetPacket* packet = enet_packet_create((char*)&var, sizeof(var) + 1, ENET_PACKET_FLAG_RELIABLE);
enet_host_broadcast(client, 0, packet);

次に、サーバーはデータを受け取り、次のように同じ構造にキャストします。

//receives 21 bytes, which is correct
packetFormat* var = (packetFormat*)(event.packet->data);

ただし、変数を確認すると、var->type は 5 に等しく、これは正しいのですが、size() またはベクターの内容を確認しようとすると、サーバーがクラッシュするか、ガベージ データが返されます。前に言ったように、これは構造体のベクトルが実際にはポインターであるためだと思いますが、生データを送信して再構築する方法を知っている人はいますか? ありがとう。

4

1 に答える 1

1

コードが何をしているのかを理解していればstruct、固定幅データムのように、間接的なものがないかのようにシリアル化するだけです。

ベクターは内部的にそのデータへのポインターを持っているためvector、構造体でシリアル化すると、ポインターの値のみが送信され、ポインターが指す実際のデータ自体は送信されません。

sizeofまた、と のレイアウトがvectorホストとクライアントのサイズで同じであるという保証はほとんどまたはまったくありません。

送信したい場合はvector、Boost.Asio など、ベクトルを理解する C++ ネットワーク ライブラリの使用を検討します。

于 2013-12-27T23:49:26.057 に答える