【发布时间】:2016-12-15 06:12:00
【问题描述】:
在c编程中使用阻塞函数读取时,有什么方法可以区分不同数据包的有效载荷吗?我从 TCP 客户端以数据包的形式发送每条消息,当我在 TCP 服务器中读取(使用读取功能)它时,我将所有消息放在缓冲区中,中间没有任何分隔符。
【问题讨论】:
-
TCP 是面向流的。就您的应用程序而言,没有数据包,只有不间断的字节流。协议底层的数据包可以被任何中间方随意拆分和合并,所以看它们是没有意义的。
在c编程中使用阻塞函数读取时,有什么方法可以区分不同数据包的有效载荷吗?我从 TCP 客户端以数据包的形式发送每条消息,当我在 TCP 服务器中读取(使用读取功能)它时,我将所有消息放在缓冲区中,中间没有任何分隔符。
【问题讨论】:
【讨论】:
TCP是面向流的,这意味着没有可以将它们分开的数据包,因此您必须实现您的协议,例如您可以在发送每个数据包之前发送4字节的标头数据并告诉接收者下一个数据包大小,在接收端,你应该总是读取一个 4 字节的头(标识下一个数据包的大小)并使用头中指定的大小进行阻塞读取。
另一个选择是使用固定大小的数据包,所以每次你必须从 TCP 缓冲区读取固定大小的数据包。
与 TCP 不同,UDP 是面向数据包的,正如您所愿。在 UDP 数据包中以发送的大小接收,不会发生其他缓冲或连接,但它是不可靠的。
【讨论】: