UDP recvfrom查询

时间:2015-10-11 18:12:00

标签: c sockets tcp udp recvfrom

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

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

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

  2. 如果我已经请求buflen 2000并且套接字队列中的单个数据包大小为1400,该怎么办?

  3. 上述问题的答案是否适用于TCP和UDP?如果没有,那么差异是什么。

  4. 提前感谢回复。

2 个答案:

答案 0 :(得分:3)

首先,如果已经有东西等待读取,或者套接字处于非阻塞模式,recvfrom()只会立即返回 。否则,它等待数据到达。

其次,UDP是全有或全无。与对数据流进行操作的TCP不同,UDP在数据报中运行,而数据报不能被分片读取。

所以,回答你的问题:

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

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

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

答案 1 :(得分:2)

recvfrom()从套接字读取buflen。它可以读取更少,这就是为什么你应该总是检查返回值。

1)它会将2000个字节复制到缓冲区中。对于UDP,多余的数据将丢失。对于TCP,您应该能够通过另一次调用recvfrom()来接收它。

2)它会将1400个字节复制到缓冲区中。

3)通常recvfrom()用于UDP,recv()用于TCP,但其他行为与上述相同。