1

Windows ソケットで構造体を送信したい。TCPプロトコルを使用しています。

たとえば、私はこの構造を持っています:

typedef struct  headerLobby
{
    unsigned      nbGames;
}    head; 

私は自分の構造を送ります:

char buff[DEFAULT_BUFFER_LENGTH]; //DEFAULT_BUFFER_LENGTH = 512
headerLobby header;

header.nbGames = 1;
memcpy(buff, &header,  sizeof(headerLobby));
send(ClientSocket, buff, sizeof(headerLobby, 0);

私はデータを受け取ります:

headerLobby header;

char recvbuf[DEFAULT_BUFFER_LENGTH];
memset(recvbuf, 0, DEFAULT_BUFFER_LENGTH);
int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);

memcpy(&header,recvbuf,  sizeof(headerLobby));

しかし、header.nbrGames を出力すると、あまり価値がありません。

クライアントとサーバーはどちらも Windows 8 64 ビットで、プロセッサは Intel x64 です。コードの何が問題なのかわかりません。

4

4 に答える 4

1

送信しようとしていて受信している16進データをダンプできますか。Wireshark/同様のツールを使用して送信側/受信側でパケット キャプチャを実行し、ネットワーク上で表示されているパケット データが期待どおりであることを確認します。

いくつかのベストプラクティス、

  1. 常に構造を整列サイズに保ちます。必要に応じて、構造体の最後にパディングを使用します。そうしないと、コンパイラは構造体のサイズを自動的に調整し、ネットワーク上で送信するデータが送信しようとしているデータと一致しない可能性があります。

  2. ネットワーク上で何かを送信する前に、データをネットワーク バイト順で保持します。htonl を使用して変換できます。アーキテクチャは同じで、データなどを扱っているため、ここでは問題を引き起こしていない可能性がありますが、移植可能なコードでは問題が発生する可能性があります。

于 2013-11-09T01:55:50.360 に答える
0
  (...)
  header.nbGames = 1;
  memcpy(buff, &header, sizeof(struct headerLobby));
  send(ClientSocket, buff, sizeof(struct headerLobby), 0);

  memset(recvbuf, 0, 20);
  int iResult = recv(ConnectSocket, recvbuf, 20, 0);
  memcpy(&recvheader, recvbuf, sizeof(struct headerLobby));

  printf("%d\n", recvheader.nbGames);
  (...)

$ ./アウト

1

だから、それは動作します。あなたのコードは正しいです。または、明らかに編集してここに貼り付け、問題のある部分を削除しました。ヒント: 常に、問題を証明または反証する最小限のテスト ケースを作成してください。

于 2013-11-09T03:25:14.923 に答える
0

エラーが見つかりました。サンプルコードは機能しますが、私のエラーは、いくつかの構造を送信したかったことです。構造体を送ったとき、ポインタを最初の構造体に送りませんでした。

例えば ​​:

char buff[DEFAULT_BUFFER_LENGTH]; //DEFAULT_BUFFER_LENGTH = 512
headerLobby header;
GameInfo info; //other struct

header.nbGames = 1;
info.nbPlayers = 3;
memcpy(buff, &header,  sizeof(headerLobby));
buf += sizeof(headerLobby);
memcpy(buf, &info, sizeof(gameInfo));
send(ClientSocket, buff, sizeof(headerLobby, 0); //I lost the pointeur to the first struct
于 2013-11-09T12:24:47.260 に答える
-1

安全に行うことができますが、構造体データをソケットで送信する (またはそのために任意のバイナリ メソッドを使用する) ことは、いくつかの理由で危険です。

組み込み型のサイズは、マシンごとに異なる場合があります。
送信マシンのパディングは、受信マシンでは異なる場合があります。
送信側マシンのエンディアン規則は、受信側マシンとは異なる場合があります。

一般に、最初から構造体データをこの方法で送信することはお勧めできませんが、次の点に注意してください。

最初にデータをバッファにシリアル化すると (この投稿の功績)、これらの問題は解決されます。

于 2013-11-09T03:10:13.507 に答える