C++ C++;如何通过套接字(TCP)进行二进制序列化
对不起,我的英语不好 背景: 我有6个变量C++ C++;如何通过套接字(TCP)进行二进制序列化,c++,c,sockets,C++,C,Sockets,对不起,我的英语不好 背景: 我有6个变量 无符号字符 煤焦 无符号短 int int int 我序列化此数据以准备发送到套接字 问题是,如何存储序列化数据并发送它 我的第一个解决方案是使用“发送我的数据”结构,但此解决方案需要强制转换,并且强制转换操作非常缓慢 您有比将变量存储在结构中更好的解决方案吗 #include <sstream> #include <string.h> typedef int SOCKET; typedef struct sockaddr_i
#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);
#包括
#包括
输入插座;
sockaddr_中的typedef结构sockaddr_;
类型定义结构sockaddr sockaddr;
#定义端口4241
样板
内联std::ostream和原始写入(std::ostream&os,const T&T)
{
返回os.write(reinterpret_cast(&t),sizeof t);
}
int main()
{
焦原科尔;
字符id_模块;
未签名的短id_消息;
int id_客户端;
int size_msg;
无符号长时间戳;
套筒锁;
csin中的SOCKADDR_;
protocole=1;
id_模块=2;
id_消息=256;
id_client=8569;
尺寸=145;
时间戳=1353793384;
csock=socket(AF\u INET,SOCK\u STREAM,0);
csin.sin_addr.s_addr=inet_addr(“127.0.0.1”);
csin.sin_family=AF_INET;
csin.sin_port=htons(port);
连接(csock,(SOCKADDR*)和csin,sizeof(csin));
原始写入(ss,协议);
原始写入(ss、id\U模块);
原始写入(ss、id消息);
原始写入(ss、id\U客户端);
发送(csock,ss.str().c_str(),strlen(ss.str().c_str()),0);
关闭(csock);
}
无法工作,因为字符串包含“\0”并发送剪切
我说,cast在很多数据发送上都很慢。在接收时,我需要再次强制转换以恢复我的数据
此操作比仅读取字节要慢。如果不想从头开始,可以使用。它是一个强大的库,允许您定义一个协议,它只是一个类,可以将自身(反)序列化为流、文件、缓冲区或字符串 我自己使用它,它很好地将它序列化为一个字符串,很容易通过套接字发送 编辑:回复评论:
好的,那么请注意,它不是
send(…)
截断您的流。它的c_str()以'\0'
结尾。也许您应该尽量避免使用流,并使用容器提供对原始数据的访问,如std::string或std::vector withconst void*data()
。你可以把这个和size()
传给send(…)
施放动作慢吗?从什么时候开始?在很多包上施放动作。在10万个数据包上做一个基准测试“演员阵容很慢”。。。演员阵容不对;慢与此无关。电汇就是以便携形式打包和解包数据。考虑函数如<代码> Htnts ,<代码> HTOLS 等。开发一个协议,并坚持下去。这仍然不能使它慢下来。(除了与序列化相反之外,这是一个单独的问题。)您能告诉我们如何序列化和发送数据,以及为什么您认为强制转换是瓶颈吗?(用它更新你的问题)是的,这个库是一个很好的选择,但是我需要制作我自己的系统。Thx,对于u解决方案,我尝试它