Cod*_*der 5 c sockets udp tcp recvfrom
int recvfrom(SOCKET socket,
char * buffer,
int buflen,
int flags,
struct sockaddr * from,
int * fromlen);
Run Code Online (Sandbox Code Playgroud)
我知道从套接字recvfrom()读取后立即返回buflen。我的问题是 -
如果我请求了buflen2000 个数据包并且套接字队列中的单个数据包大小为 2400,该怎么办?
如果我请求了buflen2000 个数据包,而套接字队列中的单个数据包大小为 1400,该怎么办?
上述问题的答案对于 TCP 和 UDP 是否相同?如果不是,有什么区别。
提前感谢您的回复。
首先,只有当已经有东西等待读取或者套接字处于非阻塞模式时才立即recvfrom()返回。否则,它会等待数据到达。
其次,UDP 是要么全有要么全无的。与 TCP 操作流数据不同,UDP 操作数据报,并且数据报不能分段读取。
所以,回答你的问题:
2000 个字节将被复制到您的缓冲区中,剩余的 400 个字节将被丢弃并丢失,因为您的缓冲区太小而无法接收完整的数据报。recvfrom()将报告 EMSGSIZE 错误。
您的缓冲区足够大,可以接收完整的数据报,因此 1400 字节将被复制到您的缓冲区中。recvfrom()将报告成功。
这些不适用于 TCP。首先,您通常不使用recvfrom()TCP,recv()而是使用 TCP。但无论哪种情况,在 TCP 中,都会接收当时当前可用的recv/from()任何字节,如果需要则阻塞,最多达到指定的字节数,但可能更少。您可以继续调用以接收剩余字节,因为 TCP 是基于流的。由于 UDP 是基于消息的,因此您无法接收剩余字节,它们会丢失。接下来将读取下一个可用的数据报。recv/from()recv/from()