0

在简单的客户端-服务器程序中,客户端发送 12 个字节的数据。我正在使用 recvfrom(),在连续调用中请求 2 和 10 个字节。如果第一次调用 recvfrom() 将返回 2 个字节。但是第二个电话被阻止了。为什么会这样?我认为 TCP 套接字不会发生这种情况,其中连续的读取调用返回可用字节(此处为 10)。

4

2 回答 2

5

手册页有以下相关信息(加粗):

对于基于消息的套接字,例如 SOCK_RAW、SOCK_DGRAM 和 SOCK_SEQPACKET,应在单个操作中读取整个消息。如果消息太长而无法放入提供的缓冲区,并且标志参数中未设置 MSG_PEEK,则应丢弃多余的字节

您需要在一次调用中阅读它。

于 2013-02-11T18:20:05.497 回答
1

我认为您len对 recvfrom 函数的第三个 ( ) 参数感到困惑。

ssize_t recvfrom(int s, void *buf, size_t len, int flags,
                 struct sockaddr *from, socklen_t *fromlen);

后者表示缓冲区 ( void *buf) 有多大,而不是您要从数据包中提取多少字节。

UDP类型套接字中,您必须读取其他对等方发送给您的整个数据包(UDP确保它不会分段到达)并避免像TCP模式一样多次读取发送的数据。

在您的情况下,如果您的缓冲区是 2 个字节,则其他 10 个字节将被丢弃(查看recvfrom手册页)

于 2013-02-11T18:29:22.587 回答