我有一个客户端-服务器程序。他们与一些角色交流。
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',然后依次检查收到的C'。
有没有办法在客户端中做到这一点并避免使用缓冲区?
最佳答案
理想情况下,您应该发送然后等待回复,当您收到较早的回复时发送下一个请求。 但显然,您的客户端似乎无需等待回复即可发送,而服务器会回复任何已完成处理的请求。
在这种情况下,您需要根据发送和接收的数据在客户端和服务器程序中设置一种机制。
您可以决定您的客户端和服务器将处理具有(Header+data)格式的数据,例如:
length(2 bytes) - length of actual data
sequence numner(2 bytes) - to be incremented for each request
Actual data(length number of bytes)
当您发送数据时,在通过套接字发送后,将请求数据保存在等待服务器回复的待处理请求列表中。 服务器收到上述格式的请求后,将在“实际数据”部分更新其回复数据,更新 header 中的长度,保持顺序不变,服务器将回复客户端。 客户端会将回复中的序列号与其待处理列表中的项目进行匹配,以获取从服务器收到其回复的请求
关于c - TCP/IP : message got by recv() in order without keep buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44793820/