【问题标题】:How can we send data to ipv4 and ipv6 google interface using non connected socket udp in C?我们如何使用 C 中的非连接套接字 udp 将数据发送到 ipv4 和 ipv6 谷歌接口?
【发布时间】:2019-04-23 16:37:56
【问题描述】:

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

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

【问题讨论】:

    标签: c sockets udp getaddrinfo sendto


    【解决方案1】:

    一个明显的问题是您没有为sendto 调用中的地址长度传递足够的字节。 ai_addr字段是struct sockaddr *,但struct sockaddr只是一个头结构,真正的地址结构会分配更大的结构。

    请改用list-&gt;ai_addrlen。

    【讨论】:

    • 您是否尝试将 UDP 发送到移动设备?
    • 我认为它的工作方式相同抱歉...谢谢您的帮助!我会照看一些文件!
    • 你有相关文档吗?
    【解决方案2】:

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

    ip -6 route | grep default
    

    检查我们是否有 ipv6 连接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2011-12-26
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2021-12-01
      • 2021-04-16
      • 2010-11-13
      相关资源
      最近更新 更多