我正在尝试编写一个通过UDP接收查询并通过UDP发送响应的服务器。我遇到的问题是,当我尝试发送响应时,我收到“101网络无法访问”错误。
基于问题here我尝试通过取出hints.ai_flags = AI_PASSIVE;
行解决此问题,但服务器从未成功获取消息。我查看了addrinfo
的手册页,听起来好像设置了AI_PASSIVE
标志,套接字只能recvfrom()
,而如果没有设置,套接字只能{{1 }}。我在网上看过很多例子,人们从一个插槽中做两件事;我错过了什么?
相关代码:
sendto()
是的,我有错误检查所有这些电话(这就是我发现问题的方法);为了简洁起见,它被简单地遗漏在这里。
答案 0 :(得分:8)
您不应使用struct sockaddr
在recvfrom
调用中存储源地址,它可能无法表示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);