我正在尝试将一些随机数据报发送到主机www.google.fr到ipv4和ipv6接口,这在ipv4上工作得很好,但不适用于ipv6。我想通过UDP协议用一个未连接的套接字来实现。
我使用getaddrinfo和sendto函数做了一些事情,但是当我在ipv6接口上调用sendto时,它失败了,并输出"network is unreachable“。
int main() {
int s = socket(AF_INET6, SOCK_DGRAM, 0);
char test[4];
struct addrinfo hints = {0};
hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_V4MAPPED|AI_ALL;
struct addrinfo* res = {0};
struct addrinfo* list;
int exit_status = getaddrinfo("www.google.fr","8080", &hints, &res);
if (exit_status != 0){
perror("getaddrinfo:");
return EXIT_FAILURE;
}
for (list = res; list != NULL; list = list->ai_next) {
if (list->ai_family == AF_INET6) {
printf("AF_INET6\n");
int rc = sendto(s, test, 4, MSG_MORE, list->ai_addr, sizeof(*list->ai_addr));
if (rc < 0) {
perror("PROBLEME ... ");
}
}
}
return EXIT_SUCCESS;
}我希望不会出现打印错误,但我发现网络是无法访问的。我想知道为什么这不工作的人有什么想法吗?
发布于 2019-04-24 00:54:01
一个明显的问题是,您没有为sendto调用中的地址长度传递足够的字节数。ai_addr字段是struct sockaddr *,但struct sockaddr只是一个报头结构,实际的地址结构会分配更大的结构。
请改用list->ai_addrlen。
发布于 2019-04-24 09:36:16
这是因为,我在4g模式下没有ipv6连接,我们可以
ip -6 route | grep default检查我们是否有ipv6连接
https://stackoverflow.com/questions/55815814
复制相似问题