c - TCP/IP : message got by recv() in order without keep buffer

标签 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',然后依次检查收到的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/

相关文章:

c - 这个表达式是什么意思,为什么编译?

c++ - 客户端断开连接时 TCP 套接字选择服务器段错误

c - 这个混淆的 C 行如何打印 "EMIL"?

c - gcc 无法识别某些 SDL 函数

linux - 我怎么知道哪些文件被 linux 机器中的特定进程修改了?

c++ - 寻找一种准确的方法来对用 C++ 编写并在 Linux/OSX 上运行的小型代码路径进行微基准测试

java - TableView内容不显示

c++ - TCP 套接字上的 read() 何时返回

c - C 中的列表实现

c - 如何检查指针是否在分配的内存中写入?