c - UDP recvfrom查询

标签 c sockets tcp udp recvfrom

int recvfrom(SOCKET            socket, 
             char            * buffer, 
             int               buflen, 
             int               flags, 
             struct sockaddr * from, 
             int             * fromlen);

我知道 recvfrom() 在从套接字读取 buflen 后立即返回。我的问题是 -

  1. 如果我请求了 2000 的 buflen 并且套接字队列中的单个数据包的大小为 2400 怎么办?

  2. 如果我请求的 buflen 为 2000,而套接字队列中的单个数据包大小为 1400,会怎样?

  3. 上述问题的答案是否适用于 TCP 和 UDP?如果不是,有什么区别。

提前感谢您的回复。

最佳答案

首先,recvfrom() 仅在已经有内容等待读取或者套接字处于非阻塞模式时才返回立即。否则,它等待数据到达。

其次,UDP 是全有或全无。与操作流数据的 TCP 不同,UDP 操作的是数据报,数据报不能分段读取。

所以,回答你的问题:

  1. 2000 字节将被复制到您的缓冲区中,剩余的 400 字节将被丢弃和丢失,因为您的缓冲区太小无法接收完整的数据报。 recvfrom() 将报告 EMSGSIZE 错误。

  2. 您的缓冲区足够大,可以接收完整的数据报,因此 1400 字节将被复制到您的缓冲区中。 recvfrom() 会报告成功。

  3. 这些不适用于 TCP。首先,您通常不会对 TCP 使用 recvfrom(),而是使用 recv()。但在任何一种情况下,在 TCP 中,recv/from() 都会接收当时 当前可用 的任何字节,如果需要则阻塞,直到指定的字节数,但可能少点。您可以继续调用 recv/from() 来接收剩余的字节,因为 TCP 是基于流的。由于 UDP 是基于消息的,您无法接收剩余的字节,它们会丢失。下一个 recv/from() 将读取下一个可用的数据报。

关于c - UDP recvfrom查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068410/

相关文章:

Python socket 强调并发

Java 通过 TCP 套接字从队列或堆栈发送对象

c# - 使用tcp将 float 组从c++发送到c#

c - 在 Linux C 程序中的非特权套接字(非原始套接字)上设置 TCP 选项

c - double - 最大值

c - 使用带有指针的数组,如何使用选择排序对数字进行排序?

java - 为什么 OutputStream.write() 关闭套接字连接?

apache - 为什么我们需要在 http 响应消息中同时使用状态代码和短语代码?

C recv 函数行为

c - 比较函数返回值的正确方法是什么