Как мы можем отправить данные в ipv4 и ipv6 google interface, используя неподключенный сокет udp в C? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь отправить случайную дейтаграмму на хост www.google.fr на интерфейсы ipv4 и ipv6, это нормально работает для ipv4, но не для ipv6. Я хотел сделать это с одним неподключенным сокетом по протоколу UDP.

Я сделал что-то, используя getaddrinfo и функцию sendto, но когда я вызываю sendto на интерфейсах ipv6, он выходит из строя и выдает «сеть недоступна».

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; 
}

Я ожидаю, что нет печати perror, но я получаю, что сеть недоступна. Я хотел бы знать, почему это не работает у кого-нибудь идеи?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Одна очевидная проблема заключается в том, что вы не передаете достаточно байтов для длины адреса в вызове sendto.Поле ai_addr - это struct sockaddr *, но struct sockaddr - это просто структура заголовка, а структуры реального адреса будут выделять более крупные структуры.

Используйте взамен list->ai_addrlen.

0 голосов
/ 24 апреля 2019

Это потому, что у меня нет соединения ipv6 в режиме 4g, мы можем

ip -6 route | grep default

проверить, есть ли у нас соединение ipv6

...