我正在尝试向ipv4和ipv6接口发送一些随机数据报以将www.google.fr托管到ipv4和ipv6接口,这对于ipv4可以正常工作,但对于ipv6则不能。我想通过UDP协议使用一个未连接的套接字来完成此操作。
我使用getaddrinfo和sendto函数做了一些操作,但是当我在ipv6接口上调用sendto时,它失败并显示“网络不可达”。
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;
}
我希望不会出现错误打印,但我无法到达网络。我想知道为什么这对任何人都不起作用?
答案 0 :(得分:1)
一个明显的问题是,您在sendto
调用中传递的字节数不足以达到地址长度。 ai_addr
字段是struct sockaddr *
,但是struct sockaddr
只是标头结构,实际地址结构将分配更大的结构。
改为使用list->ai_addrlen
。
答案 1 :(得分:0)
这是因为,我在4g模式下没有ipv6连接,我们可以做到
ip -6 route | grep default
检查是否有ipv6连接