TCP / IP:recv()按顺序获取的消息,没有保持缓冲区

时间:2017-06-28 04:44:14

标签: c linux sockets tcp

我有一个客户端 - 服务器程序。他们与一些角色交流。

ex:
client --send A-> server
then
client <-recv A'-- server

但我让服务器不按顺序发回消息。

ex:
client --A--> --B--> --C--> server
then
client <--A'-- <--C'-- <--B'-- server
what I want:
client <--A'-- <--B'-- <--C'-- server

所以我想处理客户端程序中的情况

我只想出一种方法是保持缓冲区来记录来自服务器的数据,客户端将检查B&#39;收到然后检查C&#39;按顺序收到。

无论如何在客户端做到这一点并避免使用缓冲区?

1 个答案:

答案 0 :(得分:0)

理想情况下,您应该发送然后等待回复,当您收到先前的回复时发送下一个请求。 但显然你的客户似乎在没有等待回复的情况下发送,服务器回复其处理的任何请求。

在这种情况下,您需要根据发送和接收的数据在客户端和服务器程序中设置机制。

您可以决定您的客户端和服务器将处理具有(标头+数据)格式的数据:

length(2 bytes) - length of actual data
sequence numner(2 bytes) - to be incremented for each request
Actual data(length number of bytes)

当您发送数据时,请在通过套接字发送之后将请求数据保留在等待服务器回复的待处理请求列表中。 以上述格式接收请求的服务器,将在“实际数据”部分更新其回复数据,更新报头长度,保持顺序,服务器将回复客户端。 客户端会将回复中的序列号与其待处理列表中的项目进行匹配,以获取从服务器

收到回复的请求