0

我构建了 UDP 服务器或 TCP 服务器,它们使用recv()recvfrom接收来自客户端的数据包

但在我看来,机制是:内核从网络接收数据包并将IP / TCP / UDP标头条带化,然后将数据有效负载部分放入内核缓冲区,然后recv()recvfrom()从内核缓冲区读取数据

所以这意味着缓冲区中只有字节,并且字节没有被分成部分,每个部分对应一个UDP数据报/TCP段的有效负载

如果我希望每次调用recv()recvfrom()只接收一个 TCP 段或 UDP 数据报(注意,一个 TCP 或 UDP 数据包可能由于 IP 分片而包含多个 IP 数据包)

有可能吗?

如果是这样,如何?谢谢!

4

1 回答 1

1

我希望每次调用 recv() 或 recvfrom() 只接收一个 TCP 段

不。它可能会返回从一个字节到您提供的长度的任何内容(或在非阻塞 mdoe 中返回零字节),并且数据可能会跨越 TCP 段边界,并不是说您有任何方法可以判断 TCP 段边界在第一名。您必须将 TCP 连接视为字节流,仅此而已。

或 UDP 数据报

是的。

于 2013-04-04T23:14:59.943 回答