【问题标题】:does socket.h's recvfrom() function recieve individual packets?socket.hs recvfrom() 函数是否接收单个数据包?
【发布时间】:2013-12-28 03:06:59
【问题描述】:

man page for recvfrom 将其行为总结为“从套接字接收消息”。如果套接字是 SOCK_STREAM 或 SOCK_DGRAM 类型,“消息”是否与“数据包”同义?如果不是,它有什么不同?

【问题讨论】:

  • 流套接字没有消息,因此 API 不可能读取消息。 TCP 只是没有消息边界。
  • 没有消息边界——我想这就是为什么它们被称为流套接字。但是,手册页到处都使用“消息”这个词。假设 recvfrom 在流套接字上工作,手册页引用的“消息”是什么?
  • 你为什么首先问这个?对 TCP 使用 recvrecvfrom 用于面向消息的协议。
  • 试图了解数据包中发送的内容与recv访问的内容之间是否存在1-1对应关系。在我看来没有,recv 可能会访问多个数据包的内容。
  • 是的,message 这个词的用法在该页面上令人困惑。网络数据包和recv() 结果通常没有一对一的关系,但它取决于底层传输和配置(缓冲区大小、Nagle、消息大小、吞吐量、协议……)和 can实际上是由底层协议承诺的(参见UDP)。

标签: sockets unix


【解决方案1】:

我的第一个想法是 recvfrom 在流套接字上工作只是因为没有理由禁止它。正如那句名言:

“Unix 的设计初衷并不是阻止其用户做愚蠢的事情,因为这也会阻止他们做聪明的事情。” – 道格·格温

如果它符合我的预期,您可以将它用作read()getpeername() 的组合,因为它返回发件人的地址。这可能被认为是聪明的。

但后来我在 Linux 上尝试了它,但它并没有那样工作。源地址缓冲区未更改,长度指示符设置为 0。

所以现在我不知道该说什么,除非不要在流套接字上使用它。这不适合他们。

附录:不,即使在我最疯狂的梦想中,我也不会期望它可以让您访问 TCP 流中的数据包边界。已经通过 tcp 接收机制的数据不再由数据包组成。

【讨论】:

  • “recv() 调用通常仅用于连接的套接字 [...],它与带有 NULL src_addr 参数的 recvfrom() 相同。”跨度>
  • 你的意思是什么,@CodeCaster?我认为这里没有人不清楚recvrecvfrom 之间的关系。
  • 这是关于recv()recvfrom() 是否可以互换,我用recv() 手册明确说明的内容对此进行了评论。当然,我不知道 OP 在他的问题中是否特别表示 recvfrom(),因为 recv() 记录在同一页面上。
  • 我发现的手册页之一表明 recv 将来可能会被删除,因为它与带有 NULL src_addr 参数的 recvfrom() 相同。如果我没有看到这一点,我会用recv问这个问题。并不是要混淆视听。
  • 如果 recvfrom() 返回零,则表示对等方已断开连接。将来recv() 被删除的机会恰好为零。我怀疑你是否真的读过类似的东西。
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多