3
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 回答 2

3

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

其次,UDP 是孤注一掷。与对流数据进行操作的 TCP 不同,UDP 以数据报的形式进行操作,数据报不能分段读取。

所以,回答你的问题:

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

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

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

于 2015-10-11T18:57:06.223 回答
2

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

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

2) 它将 1400 字节复制到您的缓冲区中。

3) 一般recvfrom()用于 UDP,recv()用于 TCP,其他行为同上。

于 2015-10-11T18:52:13.810 回答