C++ C++;如何通过套接字(TCP)进行二进制序列化

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

对不起,我的英语不好

背景:

我有6个变量

  • 无符号字符
  • 煤焦
  • 无符号短
  • int
  • int
  • int
  • 我序列化此数据以准备发送到套接字

    问题是,如何存储序列化数据并发送它

    我的第一个解决方案是使用“发送我的数据”结构,但此解决方案需要强制转换,并且强制转换操作非常缓慢

    您有比将变量存储在结构中更好的解决方案吗

    #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 with
    const void*data()
    。你可以把这个和
    size()
    传给
    send(…)

    施放动作慢吗?从什么时候开始?在很多包上施放动作。在10万个数据包上做一个基准测试“演员阵容很慢”。。。演员阵容不对;慢与此无关。电汇就是以便携形式打包和解包数据。考虑函数如<代码> Htnts ,<代码> HTOLS 等。开发一个协议,并坚持下去。这仍然不能使它慢下来。(除了与序列化相反之外,这是一个单独的问题。)您能告诉我们如何序列化和发送数据,以及为什么您认为强制转换是瓶颈吗?(用它更新你的问题)是的,这个库是一个很好的选择,但是我需要制作我自己的系统。Thx,对于u解决方案,我尝试它