通过套接字发送信息的时间(TCP,C ++)

时间:2017-01-17 08:55:52

标签: c++ sockets tcp

我在使用客户端和服务器之间的TCP通信的C ++程序上工作。在程序的某个时刻,有一个循环,服务器向客户端发送一个大小为x的序列化对象object1,然后是一个大小为y的序列化对象object2。客户端有一个循环,有两个连续的recv()调用来接收这些对象。

问题是有时客户端中的第一个recv()接收大小为(x + y)的对象,即服务器在客户端开始等待object1之前发送了两个对象。如何防止这种情况?

2 个答案:

答案 0 :(得分:2)

描述的问题是TCP的流性质的影响。这意味着TCP协议并不关心消息边界。所以你需要添加它们。

一种可能的解决方案是在通过连接发送的任何对象之前添加标头。例如:

x <object1> y <object2>

其中x和y是32位数字。当您从连接中读取数据时,您在第一步读取sizeof对象,然后对象本身。

此解决方案比消息确认方法好得多,因为发送方在发送第二个对象之前不必等待。

您可能希望了解的另一个注意事项:在网络协议中,您需要关注整数的字节顺序。您可能会看到详细信息here

答案 1 :(得分:1)

如果客户端成功收到object1,则可以阻止发送object2。

如果客户端成功获得1个对象,客户端将回答您的服务器,然后您的服务器可以发送下一个对象。你可以通过创建客户端和服务器知道的一些电报来做到这一点。