套接字UDP:使用Sendto()中Recvfrom()的发件人信息失败

时间:2012-04-19 21:36:42

标签: c sockets udp

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

基于问题here我尝试通过取出hints.ai_flags = AI_PASSIVE;行解决此问题,但服务器从未成功获取消息。我查看了addrinfo的手册页,听起来好像设置了AI_PASSIVE标志,套接字只能recvfrom(),而如果没有设置,套接字只能{{1 }}。我在网上看过很多例子,人们从一个插槽中做两件事;我错过了什么?

相关代码:

sendto()

是的,我有错误检查所有这些电话(这就是我发现问题的方法);为了简洁起见,它被简单地遗漏在这里。

1 个答案:

答案 0 :(得分:8)

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

您应该使用struct sockaddr_in作为IPv4地址,或struct sockaddr_in6作为IPv6地址,或者更好的是struct sockaddr_storage来应对。

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

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