首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字UDP:在Sendto()中使用Recvfrom()中的发送方信息失败

套接字UDP:在Sendto()中使用Recvfrom()中的发送方信息失败
EN

Stack Overflow用户
提问于 2012-04-20 05:36:42
回答 1查看 34.4K关注 0票数 4

我正在尝试编写一个通过UDP接收查询并通过UDP发送响应的服务器。我遇到的问题是,当我试图发送我的响应时,我得到一个"101网络无法到达“的错误。

基于问题here,我试图通过删除hints.ai_flags = AI_PASSIVE;行来解决这个问题,但是服务器从未成功地接收到消息。我查看了addrinfo的手册页,它听起来好像如果设置了AI_PASSIVE标志,套接字只能recvfrom(),而如果没有设置,套接字只能sendto()。不过,我在网上看到了很多这样的例子,人们在同一个socket上同时做这两件事;我错过了什么?

相关代码:

代码语言:javascript
复制
struct addrinfo hints;
struct addrinfo *serverinfo;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;

int status = getaddrinfo(NULL, port, &hints, &serverinfo);
int sock = socket(serverinfo->ai_family, serverinfo->ai_socktype, serverinfo->ai_protocol);
status = bind(sock, serverinfo->ai_addr, serverinfo->ai_addrlen);
freeaddrinfo(serverinfo);

// poll until there's an incoming packet

struct sockaddr sender;
socklen_t sendsize = sizeof(sender);
bzero(&sender, sizeof(sender));

recvfrom(sock, message, sizeof(message), 0, &sender, &sendsize);

// message processing

sendto(sock, response, sizeof(response), 0, (struct sockaddr *)&sender, sendsize);

是的,我对所有这些调用都进行了错误检查(这就是我发现问题的原因);为了简洁起见,这里只是省略了它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-20 06:31:35

您不应该在recvfrom调用中使用struct sockaddr来存储源地址,它可能无法表示IP套接字地址。

您应该使用struct sockaddr_in作为IPv4地址,或者使用struct sockaddr_in6作为IPv6地址,或者更好的方法是使用struct sockaddr_storage来处理这两种情况。

代码语言:javascript
复制
struct sockaddr_storage sender;
socklen_t sendsize = sizeof(sender);
bzero(&sender, sizeof(sender));

recvfrom(sock, message, sizeof(message), 0, (struct sockaddr*)&sender, &sendsize);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10237163

复制
相关文章

相似问题

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