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

TCP/IP:recv()按顺序获取的消息,无保留缓冲区,c,linux,sockets,tcp,C,Linux,Sockets,Tcp,我有一个客户机-服务器程序。他们与一些人物交流 ex: client --send A-> server then client <-recv A'-- server ex: 客户端--发送->服务器 然后 客户端理想情况下,您应该发送然后等待回复,在收到之前的回复时发送下一个请求。 但显然,您的客户机似乎在不等待回复的情况下发送,而服务器在处理完任何请求后都会回复 在这种情况下,您需要根据发送和接收的数据在客户端和服务器程序中设置一种机制 您可以决定您的客户机和服务器将使用(头+

我有一个客户机-服务器程序。他们与一些人物交流

ex:
client --send A-> server
then
client <-recv A'-- server
ex:
客户端--发送->服务器
然后

客户端理想情况下,您应该发送然后等待回复,在收到之前的回复时发送下一个请求。 但显然,您的客户机似乎在不等待回复的情况下发送,而服务器在处理完任何请求后都会回复

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

您可以决定您的客户机和服务器将使用(头+数据)格式的数据,如:

length(2 bytes) - length of actual data
sequence numner(2 bytes) - to be incremented for each request
Actual data(length number of bytes)
当您发送数据时,在通过套接字发送后,将请求数据保留在等待服务器回复的请求的挂起列表中。 服务器在收到上述格式的请求时,将在“实际数据”部分更新其回复数据,更新标头中的长度,保持原样,服务器将向客户端发送回复。
客户端将把reply中的序列号与其挂起列表中的项目相匹配,以获取从服务器收到的回复请求

只有在代码中存在错误时,才可能这样做。TCP保留发送字节的顺序。@EJP not bug,我设计服务器以不按顺序发送字符。一个问题。为什么?为什么要在一端故意安装一个bug,而在另一端你却不知道如何解决它?@EJP这取决于我的系统。客户端告诉服务器下载“任务A”,然后服务器告诉客户端“A'”,如果任务A完成。现在客户端告诉服务器下载“任务A”和“任务B”,但任务A下载的时间比任务B多,所以服务器先告诉客户端“B”而不是“A”。这就是为什么我有这个问题LOL。所以让客户端在新连接上发出每个请求。那你就没有自找的问题了。为什么?数据怎么会乱序呢?我不是说数据乱序,而是在服务器接收到请求数据A,然后是B,它决定回复B,然后是A的情况下,我知道TCP有机制按顺序发送数据,即如果请求数据A有多个字节,然后将以与之前相同的顺序到达sent@PrasTCP将维持秩序。但我让服务器不按顺序将字符发送回客户端。也许我需要检查客户端的内容有效性。我只想知道任何函数或api都可以处理这个问题。thxYes—一种具有序列号的协议,如前所述,或者可以将请求与响应匹配的其他协议。你必须这样做。
length(2 bytes) - length of actual data
sequence numner(2 bytes) - to be incremented for each request
Actual data(length number of bytes)