【问题标题】:Can I just peek data of tcp socket buffer to check the data is what I want in linux我可以只查看 tcp 套接字缓冲区的数据来检查数据是我在 linux 中想要的吗
【发布时间】: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 上多路复用它们,请使用序列号。
  • 或者更好的是,如果您真的想为同一个客户端进行并行处理,这似乎不太可能,请使用单独的连接。

标签: c linux sockets tcp


【解决方案1】:

我希望 A 得到 A',B 得到 B',但现在 A 得到 B',因为服务器通过相同的文件描述符发送请求。

在 TCP 中不可能,除非服务器在不同线程中处理同一连接上的多个请求,在这种情况下,简单的答案是:不要。

【讨论】:

  • 为什么不可能?在这种情况下:客户端创建3个线程通过相同的文件描述符向服务器发送消息
  • TCP不可能乱序传递数据。我提到的条件正是您评论中的条件。有什么难以理解的地方吗?
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多