【发布时间】:2017-05-03 09:58:47
【问题描述】:
我编写了一个程序,在 linux 中通过相同的文件描述符向同一服务器发送 3 个请求(比如说 A、B、C),然后我使用 recv 等待msg(让我们说 A', B', C') 返回。
服务器在 3 秒后将 msg 发回给我后,我收到了 msg,服务器将不按顺序发送 A'、B'、C' 给我。
我希望 A 得到 A' 和 B 得到 B',但现在 A 得到 B',因为服务器通过相同的文件描述符发送请求。
当 A 得到 B' 并且不通过 recv 从套接字缓冲区中删除 B' 时,A 可以继续等待吗?
【问题讨论】:
-
你能不能把乱序的回复排队,直到所需的序列可用?我看不出能够“窥视”通讯堆栈缓冲区有什么帮助。只需解开用户空间中的回复即可。
-
听起来您希望 API 为您完成工作。您无法更改接收物品的顺序。我建议您缓冲收到的数据并根据需要进行处理。
-
我会将多余的数据保存在应用程序的某个地方,而不是保存在内核的缓冲区中。套接字缓冲区是有限的......保持数据未读可能会在某些时候阻塞套接字。
-
TCP 是一种流协议。要么按顺序处理请求,要么如果你想以任意顺序在 TCP 上多路复用它们,请使用序列号。
-
或者更好的是,如果您真的想为同一个客户端进行并行处理,这似乎不太可能,请使用单独的连接。