无法在辅助接口上接收 UDP/IPv6 数据包

2024-01-11

我有以下用于 UDP 服务器的 C 代码,它将绑定到辅助接口 tap0 的 ipv6 地址。

context_t *
new_context(const struct sockaddr *listen_addr, size_t addr_size) {
  context_t *c = malloc( sizeof( context_t ) );
  time_t now;
  int reuse = 1;

  if (!listen_addr) {
    fprintf(stderr, "no listen address specified\n");
    return NULL;
  }

  srand( getpid() ^ time(&now) );

  if ( !c ) {
    perror("init: malloc:");
    return NULL;
  }

  memset(c, 0, sizeof( context_t ) );

  c->sockfd = socket(listen_addr->sa_family, SOCK_DGRAM, 0);
  if ( c->sockfd < 0 ) {
    perror("new_context: socket");
    goto onerror;
  }

  if ( setsockopt( c->sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 )
    perror("setsockopt SO_REUSEADDR");

  if ( bind (c->sockfd, listen_addr, addr_size) < 0 ) {
    perror("new_context: bind");
    goto onerror;
  }

  return c;

 onerror:
  if ( c->sockfd >= 0 )
    close ( c->sockfd );
  free( c );
  return NULL;
}



context_t *
get_context(const char *ipaddress, const char *port, unsigned int  scopeId) {
  int s;
  context_t* ctx;
  struct addrinfo hints;
  struct addrinfo *result, *rp;

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
  hints.ai_socktype = SOCK_DGRAM; /* Coap uses UDP */
  hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST | AI_NUMERICSERV | AI_ALL;

  s = getaddrinfo(ipaddress, port, &hints, &result);
  if ( s != 0 ) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
    return NULL;
  } 

  /* iterate through results until success */
  for (rp = result; rp != NULL; rp = rp->ai_next) {
    ctx = new_context(rp->ai_addr, rp->ai_addrlen);
    if (ctx) {
      if ( rp->ai_family == PF_INET6 ) {
         struct sockaddr_in6* pSadrIn6 = (struct sockaddr_in6*) rp->ai_addr;
         if ( pSadrIn6->sin6_scope_id == 0 ) {
            pSadrIn6->sin6_scope_id = scopeId;
         }  /* End IF the scope ID wasn't set. */
      }
      goto finish;
    }
  }

  fprintf(stderr, "no context available for interface '%s'\n", node);

 finish:
  freeaddrinfo(result);
  return ctx;
}

设备 tap0 具有以下详细信息:

tap0      Link encap:Ethernet  HWaddr ce:23:fc:81:7f:65  
          inet6 addr: fe80::cc23:fcff:fe81:7f65/64 Scope:Link
          inet6 addr: aaaa::1/64 Scope:Global

我使用以下命令运行上面的代码:

./server -A aaaa::1

但它无法侦听来自 tap0 上地址 aaaa::1 的消息。我可以在 tap0 接口上的wireshark转储上看到数据包。有趣的是,从上述命令(和代码)运行的服务器可以通过本地主机接收消息。因此,如果我执行以下命令,服务器会收到消息:

nc -6 -vvv -u aaaa::1 61616 < /tmp/send_to_node_raw 

上述命令的发送和接收是通过localhost完成的。 有什么方法可以在辅助接口上以编程方式接收 UDP/IPv6 消息吗?


问题一定出在其他地方。使用上面的代码,我可以分别使用 aaaa::1/64 和 aaaa::2/64 作为本地和远程地址成功接收来自另一个节点的数据包。

尝试绑定到 :: 并查看是否可以这样工作。还尝试使用 netcat6 绑定到 aaaa::1 并从另一个 netcat6 实例接收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在辅助接口上接收 UDP/IPv6 数据包 的相关文章

随机推荐

  • getLastKnownLocation() 返回 null [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在这里阅读了很多关于这个主题的问答 但我不得不说它们都不起作用 我的问题是 即使我启用了 GPS 我也无法获取位置 除
  • 应用程序引擎 python 教程错误

    我正在尝试在这里做 python 教程http code google com appengine docs python gettingstarted helloworld html http code google com appeng
  • 如何以编程方式选择网络浏览器控件中的文本? C#

    问题是这样的 我想让我的程序的用户能够在 webBrowser 控件中搜索给定的关键字 标准 Ctrl F 我可以毫无问题地在文档中找到关键字并使用跨度和replace 函数突出显示所有实例 我am无法获得我想要使用的 查找下一个 功能 当
  • 安装 Visual Studio 2015“安装程序被阻止”并出现 10 个错误

    谁可以帮助我Visual Studio 2015安装问题 预览 Windows 更新错误 这是设置阻止的屏幕截图 以下是我在此设置中遇到的错误 Condition VersionNT v6 3 AND WindowsBuildNumber
  • Groovy def l = [1, 2, 3] as BlockingQueue

    如果我写类似的东西def l 1 2 3 as Socket这显然是无稽之谈 我明白了 org codehaus groovy runtime typehandling GroovyCastException Cannot cast obj
  • 创建子类别选择框 onChange

    我正在创建一个类别系统 用户可以从数据库中选择类别 选择后会创建另一个包含该类别子类别的选择框 所以 我的问题是我怎样才能最好地做到这一点 顺便说一句 我正在使用 Laravel 框架 第一类很简单
  • dataGridView默认错误对话框句柄

    我试图隐藏默认的 datagridview 错误对话框 我将这个事件处理程序的代码放入其中 this dataGridView2 DataError new System Windows Forms DataGridViewDataErro
  • Rails 与 bin/rails 之间有什么区别?

    作为大一新生 我遇到了许多不清楚的细节 其中之一是bin 事物 我一直想知道以下之间有什么区别 rails generate and bin rails generate 当我在控制台中运行这些命令时 它们的行为似乎相同 还有rake an
  • 使用 Drools Workbench 和 KIE 服务器的 HelloWorld

    将 KIE Drools Workbench 6 2 0 Final 安装在 JBoss 7 Application Server 本地实例中 将 Kie Server 6 2 0 Final 安装在本地 Tomcat 7 实例中 严格使用
  • 测试 WCF Web 服务?

    我想为 WCF 服务创建一个测试类 我相信 嘲笑 是正确的术语 我不太确定我认为我必须这样做的方式是正确的方式 我已获得 WCF 服务的 URL 例如 http somesite com wcf RealService svc And ht
  • iOS:如何使用 Quartz 测量字符串的宽度和高度?

    在我提出问题之前 这是来自 Apple 的文档 如何使用 Quartz 确定字符串的宽度 如果文本测量对您的应用很重要 那么可以 使用 Quartz 2D 函数计算它们 但是 您可能首先 考虑使用 ATSUI 其优势在于文本布局和 测量 A
  • 是否可以阻止来自 TFS 中某个分支的 Pull 请求?

    我在 TFS 中有一个共享分支 即很多人推送它 我想阻止人们从该共享分支向任何其他分支打开拉取请求 我可以完全控制服务器端 例如 我可以添加服务器端挂钩或安装服务器端扩展 动机 Given 1 在 TFS 中 我们将工作项与提交相关联 但是
  • 调整大小期间不要重新绘制窗口

    我的 QML 应用程序 Qt 5 4 基于Window物品 用户可以调整应用程序的大小 当应用程序调整大小时 应用程序的内容也会分别调整大小 使用onWidthChanged and onHeightChanged 这一切都很好 但为了避免
  • 将函数中的变量传递给 R 中的其他函数变量

    我正在尝试传递一个变量Phyla 这也是感兴趣的 df 列的名称 到其他函数中 但是我收到错误 Error Column税级is unknown 我明白了 在函数中声明您想要使用一次的列会更方便 因为这也会在脚本中重复多次 我尝试过使用OT
  • 在 Java 中缩短已经很短的字符串

    我正在寻找一种方法来尽可能缩短已经很短的字符串 该字符串是主机名 端口组合 可能看起来像 我的域名 se 2121 or 123 211 80 4 2122 我知道由于所需的开销和缺乏重复 对于这么短的字符串来说常规压缩几乎是不可能的 但我
  • 查找由 fmemopen 创建的文件的大小

    我在用着fmemopen创建一个变量FILE fid将其传递给从打开的文件读取数据的函数 在该函数的某处 它使用以下代码来查找文件的大小 fseek fid 0 SEEK END file size ftell fid 这对于常规文件来说效
  • Android:如何在设备上安装apk,而不使用android sdk工具

    我已将我的应用程序构建到签名的 SDK 中 我希望 beta 测试人员能够在他们的设备上安装它 而无需安装和使用 android sdk 工具 我意识到 apk 可以使用命令行工具安装 但希望没有必要 我尝试手动安装它 但失败了 我有一台
  • 去除 Chrome 和 Safari 浏览器中 html5 视频顶部和底部的黑条

    我正在使用 html5 视频 在 FireFox 中它运行良好 但在 chrome 和 safari 中 它显示顶部和底部的粗黑条 如何摆脱这个酒吧 代码
  • 如何正确清理 docker devicemapper 文件夹?

    我有一些关于存储的问题 文件夹 var lib docker devicemapper 占用了我 50 的存储空间 在文件夹中 var lib docker devicemapper mnt 我有很多空文件夹 如何正确清理 docker设备
  • 无法在辅助接口上接收 UDP/IPv6 数据包

    我有以下用于 UDP 服务器的 C 代码 它将绑定到辅助接口 tap0 的 ipv6 地址 context t new context const struct sockaddr listen addr size t addr size c