私の悪い英語でごめんなさい。
コンテキスト:
私は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' が含まれており、カットして送信するため、機能しません。
私は、多くのデータ送信でキャストが遅いと言いました。受信時に、データを回復するために再度キャストする必要があります。
このアクションは、単なるバイト読み取りよりも遅くなります。