recv()和recvfrom()从包(段)或字节的内容中读取内核缓冲区?

时间:2013-04-04 21:51:44

标签: networking network-programming

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

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

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

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

是否有可能?

如果是这样,怎么样? 谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

没有。它可以返回从一个字节到你提供的长度的任何东西(或非阻塞mdoe中的零字节),并且数据可能跨越TCP段边界,而不是你有任何方式告诉TCP段边界在哪里。您必须将TCP连接视为字节流,仅此而已。

  

或UDP数据报