我们如何使用C中未连接的套接字udp将数据发送到ipv4和ipv6 google接口?

时间:2019-04-23 16:37:57

标签: c sockets udp getaddrinfo sendto

我正在尝试向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; 
}

我希望不会出现错误打印,但我无法到达网络。我想知道为什么这对任何人都不起作用?

2 个答案:

答案 0 :(得分:1)

一个明显的问题是,您在sendto调用中传递的字节数不足以达到地址长度。 ai_addr字段是struct sockaddr *,但是struct sockaddr只是标头结构,实际地址结构将分配更大的结构。

改为使用list->ai_addrlen

答案 1 :(得分:0)

这是因为,我在4g模式下没有ipv6连接,我们可以做到

ip -6 route | grep default

检查是否有ipv6连接