首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用UDP套接字的情况下,为什么连续的recvfrom()调用被阻塞

在使用UDP套接字的情况下,为什么连续的recvfrom()调用被阻塞
EN

Stack Overflow用户
提问于 2013-02-12 02:15:16
回答 2查看 3.5K关注 0票数 0

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-12 02:20:05

man page包含以下相关信息(加粗):

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

您需要在一个调用中读取它。

票数 5
EN

Stack Overflow用户

发布于 2013-02-12 02:29:23

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

代码语言:javascript
运行
复制
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手册页)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14818284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档