Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TCP/IP消息帧示例_C++_Tcp - Fatal编程技术网

C++ TCP/IP消息帧示例

C++ TCP/IP消息帧示例,c++,tcp,C++,Tcp,我试图找到一些具体的例子,说明如何管理在TCP/IP套接字上中断传入的数据流,并将这些数据聚合到某种缓冲区中,这样我就可以在其中找到消息(具有头+分隔符的可变长度),并提取它们来为接收应用程序重建消息 任何关于有效方法的好的指针/链接/示例都将不胜感激,因为我在网上找不到好的示例,我相信过去其他人已经以有效的方式解决了这个问题 聚合缓冲区的高效内存分配 快速查找消息的消息边界以将其从缓冲区中提取 谢谢 大卫我发现这个简单的方法非常有效 分配一个固定大小的缓冲区,其大小是最大消息大小的两倍。

我试图找到一些具体的例子,说明如何管理在TCP/IP套接字上中断传入的数据流,并将这些数据聚合到某种缓冲区中,这样我就可以在其中找到消息(具有头+分隔符的可变长度),并提取它们来为接收应用程序重建消息

任何关于有效方法的好的指针/链接/示例都将不胜感激,因为我在网上找不到好的示例,我相信过去其他人已经以有效的方式解决了这个问题

  • 聚合缓冲区的高效内存分配
  • 快速查找消息的消息边界以将其从缓冲区中提取
谢谢


大卫

我发现这个简单的方法非常有效

  • 分配一个固定大小的缓冲区,其大小是最大消息大小的两倍。一个缓冲区。在缓冲区中保留一个指向数据结尾的指针
  • 分配只发生一次。下一部分是消息循环:
  • 如果不使用阻塞套接字,则在此处进行
    轮询
    选择
  • 在结束数据指针处将数据读入缓冲区。仅读取适合缓冲区的内容
  • 使用
    strhr
    扫描新数据中的分隔符。如果您发现一条消息:
    • memcpy
      将消息放入自己的缓冲区。(注意:我这样做是因为我在使用线程,您可能也应该这样做。)
    • memmove
      将剩余的缓冲区数据移动到缓冲区的开头,并更新数据指针的结尾
    • 调用消息的处理函数。(将其发送到线程池。)
还有更复杂的方法。最后我发现它们不值得你费心,但你可能会视情况而定

您可以使用带有数据指针开头和结尾的循环缓冲区。跟踪和计算剩余空间等方面有很多麻烦

您可以在找到每条消息后分配一个新的缓冲区。你不必复制这么多数据。在找到分隔符后,仍然需要将多余的数据移动到新的消息缓冲区中


不要认为像从套接字中一次读取一个字节这样的愚蠢技巧会提高性能。每次系统调用往返都会使8KB的memmove看起来很便宜。

我发现这个简单的方法非常有效

  • 分配一个固定大小的缓冲区,其大小是最大消息大小的两倍。一个缓冲区。在缓冲区中保留一个指向数据结尾的指针
  • 分配只发生一次。下一部分是消息循环:
  • 如果不使用阻塞套接字,则在此处进行
    轮询
    选择
  • 在结束数据指针处将数据读入缓冲区。仅读取适合缓冲区的内容
  • 使用
    strhr
    扫描新数据中的分隔符。如果您发现一条消息:
    • memcpy
      将消息放入自己的缓冲区。(注意:我这样做是因为我在使用线程,您可能也应该这样做。)
    • memmove
      将剩余的缓冲区数据移动到缓冲区的开头,并更新数据指针的结尾
    • 调用消息的处理函数。(将其发送到线程池。)
还有更复杂的方法。最后我发现它们不值得你费心,但你可能会视情况而定

您可以使用带有数据指针开头和结尾的循环缓冲区。跟踪和计算剩余空间等方面有很多麻烦

您可以在找到每条消息后分配一个新的缓冲区。你不必复制这么多数据。在找到分隔符后,仍然需要将多余的数据移动到新的消息缓冲区中

不要认为像从套接字中一次读取一个字节这样的愚蠢技巧会提高性能。每次系统调用往返都会使8KB的memmove看起来便宜