首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中使用非连接套接字udp将数据发送到ipv4和ipv6 google界面?

如何在C中使用非连接套接字udp将数据发送到ipv4和ipv6 google界面?
EN

Stack Overflow用户
提问于 2019-04-24 00:37:57
回答 2查看 67关注 0票数 0

我正在尝试将一些随机数据报发送到主机www.google.fr到ipv4和ipv6接口,这在ipv4上工作得很好,但不适用于ipv6。我想通过UDP协议用一个未连接的套接字来实现。

我使用getaddrinfo和sendto函数做了一些事情,但是当我在ipv6接口上调用sendto时,它失败了,并输出"network is unreachable“。

代码语言:javascript
复制
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; 
}

我希望不会出现打印错误,但我发现网络是无法访问的。我想知道为什么这不工作的人有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-24 00:54:01

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

请改用list->ai_addrlen

票数 1
EN

Stack Overflow用户

发布于 2019-04-24 09:36:16

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

代码语言:javascript
复制
ip -6 route | grep default

检查我们是否有ipv6连接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55815814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档