-1

私の悪い英語でごめんなさい。

コンテキスト:

私は6つの変数を持っています

  1. 符号なし文字
  2. チャー
  3. 署名なしの短い
  4. 整数
  5. 整数
  6. 整数

ソケットへの送信を準備するために、このデータをシリアル化します。

問題は、シリアル化されたデータを保存して送信するにはどうすればよいですか?

私の最初の解決策は、構造体を使用してデータを送信することですが、この解決策にはキャストが必要であり、キャスト アクションが非常に遅くなります。

私の変数を構造体に格納するよりも良い解決策はありますか?

#include <sstream>
#include <string.h>

typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;

#define PORT 4241
template<typename T>
inline std::ostream& raw_write(std::ostream &os, const T &t)
{
  return os.write( reinterpret_cast<const char*>(&t), sizeof t);
}

int main()
{
  char protocole;
  char id_module;
  unsigned short id_message;
  int id_client;
  int size_msg;
  unsigned long timestamp;

  SOCKET csock;
  SOCKADDR_IN csin;

  protocole = 1;
  id_module = 2;
  id_message = 256;
  id_client = 8569;
  size_msg = 145;
  timestamp = 1353793384;
  csock = socket(AF_INET, SOCK_STREAM, 0);
  csin.sin_addr.s_addr = inet_addr("127.0.0.1");
  csin.sin_family = AF_INET;
  csin.sin_port = htons(PORT);
  connect(csock, (SOCKADDR*)&csin, sizeof(csin));
  raw_write(ss, protocole);
  raw_write(ss, id_module);
  raw_write(ss, id_message);
  raw_write(ss, id_client);
  send(csock, ss.str().c_str(), strlen(ss.str().c_str()), 0);
  close(csock);

}

文字列に '\0' が含まれており、カットして送信するため、機能しません。

私は、多くのデータ送信でキャストが遅いと言いました。受信時に、データを回復するために再度キャストする必要があります。

このアクションは、単なるバイト読み取りよりも遅くなります。

4

1 に答える 1

2

ゼロからやりたくない場合は、Google Protocol Buffersを使用できます。その強力なライブラリにより、ストリーム、ファイル、バッファー、または文字列に (から) 自分自身を (逆) シリアル化できるクラスに他ならないプロトコルを定義できます。

私はそれを自分で使用しています。ソケット経由で簡単に送信できる文字列にシリアル化すると便利です。

編集:コメントに返信:

さてsend (...)、ストリームが切り捨てられていないことに注意してください。a で終わる c_str() '\0'。おそらく、ストリームを避け、 std::string や std::vector with などの生データへのアクセスを提供するコンテナーを使用する必要がありますconst void * data()size()これとに渡すことができますsend(...)

于 2012-11-28T09:49:43.677 に答える