使用c ++套接字编程的最大TCP数据包大小

时间:2012-08-20 17:01:20

标签: c++ sockets

我正在编写c ++套接字代码,我需要一些帮助! 在我的程序中,我不知道消息的大小是多少,它可能会发送文件的一部分或者它自己的文件,文件可能是一个巨大的文件,所以我应该指定数据包的最大大小,如果超过最大值,我将它除以一个以上?

2 个答案:

答案 0 :(得分:9)

使用TCP时考虑“数据包”和“消息”从来没有建设性,因为:

  • 网络引擎有自己决定最佳细分市场规模的方法
  • 段大小使没有区别到应用程序代码:接收TPC可以在将数据传递到接收进程之前自由合并段

您应该按照设计的方式查看TCP:可靠的 bytes-stream 服务。因此,只需编写足够大的块,引擎及其无数的规则就可以解决它。

答案 1 :(得分:2)

问题有点模糊,但这种做法似乎具有普遍性。发送器应发送接收器应该预期的字节数的指示。接收方应该期望看到这个指示,然后准备接收那么多字节。

就数据包大小而言,通常应用程序不担心网络本身如何传递字节,但应用程序可能不关心不调用sendrecv系统调用太多倍。这对于并发服务器尤其重要,因为效率是可伸缩性的关键。因此,您需要一个足够大的缓冲区,以避免进行太多的系统调用,但不要太大,以至于导致您长时间阻塞等待数据流入内核缓冲区。匹配send / recv套接字缓冲区大小通常就足够了,但它取决于其他因素,例如网络的带宽和延迟,以及接收器耗尽数据的速度,以及您希望每个连接允许的时间片在并发期间处理。