【问题标题】:Specifying ipv6 interface using glib/gio使用 glib/gio 指定 ipv6 接口
【发布时间】:2014-01-03 17:16:59
【问题描述】:

我正在尝试使用 Gnome glib/gio C 库来创建客户端程序以通过 IPv6 连接到服务器。我的服务器盒子有一个链接本地 IPv6 地址:

inet6 addr: fe80::2d0:c9ff:feda:99e0/64 Scope:Link

所以,要访问它,我必须告诉客户端软件使用哪个接口(在本例中为 eth0)。所以以下工作(使用端口 1500):

nc -6 fe80::2d0:c9ff:feda:99e0%eth0 1500

在 glib 中,使用 %eth0 表示法违反了 URI 表示法:

(process:31159): GLib-GIO-WARNING **: Invalid URI 'none://[fe80:0:0:0:2d0:c9ff:feda:99e0%eth0]:1500'

我查看了代码,它显然希望看到百分比转义符号(即字符“%25”),但我似乎无法正确获取格式:

** (process:5741): ERROR **: Invalid URI 'none://[fe80:0:0:0:2d0:c9ff:feda:99e0%25eth0]1500'

那么,有人知道如何指定接口吗?

编辑:这是代码

// gchar test[255] = "fe80:0:0:0:2d0:c9ff:feda:99e0%eth0";
// gchar test[255] = "fe80:0:0:0:2d0:c9ff:feda:99e0\%eth0";
// gchar test[255] = "fe80:0:0:0:2d0:c9ff:feda:99e0\x25eth0";
// gchar test[255] = "fe80:0:0:0:2d0:c9ff:feda:99e0\%%25eth0";
gchar test[255] = "[fe80:0:0:0:2d0:c9ff:feda:99e0\%%eth0]";

connection = g_socket_client_connect_to_uri (client,
                                           test,
                                           1500,
                                           NULL,
                                           &error);

编辑 2:完整代码(MichaelHampton 的输入):

#include <glib.h>
#include <gio/gio.h>

int
main (int argc, char *argv[])
{
   /* initialize glib */
  g_type_init ();

  GError * error = NULL;

  /* create a new connection */
  GSocketConnection * connection = NULL;
  GSocketClient * client = g_socket_client_new();

    connection = g_socket_client_connect_to_host (client,
                                                  (gchar*)"fe80::5054:ff:fe1f:6b6c\%br0",
                                                   1500, /* your port goes here */
                                                   NULL,
                                                   &error);

  /* don't forget to check for errors */
  if (error != NULL)
  {
      g_error (error->message);
  }
  else
  {
      g_print ("Connection successful!\n");
  }

  return 0;
}

【问题讨论】:

  • 地址在您的 first 示例中看起来是正确的。但是none:// 显然是错误的。您可能需要在此处显示一些代码。
  • 是的,您需要显示一些代码。我自己尝试过,并且能够成功建立连接。甚至不需要括号。
  • 我添加了代码。所有测试字符串都导致无效的 URI
  • 添加了完整的程序,不幸的是它仍然不适合我。
  • 我按照给定的方式运行程序(尽管我更改了端口号),得到:$ ./a.out Connection successful! 请记住,这是我的 IP 地址之一...跨度>

标签: c ipv6 glib gio


【解决方案1】:

啊,你调用了错误的函数。您应该使用g_socket_client_connect_to_host 直接连接到主机和端口。

这是一个工作示例:

 connection = g_socket_client_connect_to_host (client,
                                              (gchar*)"fe80::5054:ff:fe1f:6b6c\%br0",
                                               1500, /* your port goes here */
                                               NULL,
                                               &error);

您正在使用的完整示例代码位于相关问题中:GIO socket-server / -client example

【讨论】:

  • 是的,这就是我基于此代码的示例。我应该包含链接。所以这真的对你有用吗?我得到:(process:9392): GLib-GIO-WARNING **: Invalid URI 'none://[fe80::5054:ff:fe1f:6b6c%br0]:1500'(process:9392): GLib-GIO-CRITICAL **: g_proxy_resolver_lookup: assertion uri != NULL' 失败`** (process:9392): ERROR **: Unknown error on connect
  • 恐怕我逐字复制了您的代码。我最初切换到 *_to_uri 函数调用的原因是因为这是 *_to_host 函数调用的。我只是剪掉了中间人。有趣的是它适用于你而不是我。我在 Ubuntu 12.04 和 Debian Wheezy 上试过这个。请问你用的是什么系统?
  • 我在 Fedora 20 上运行。出于各种原因,我通常远离 Debian/Ubuntu。
  • 在运行 Fedora 19 的机器上尝试了您的代码。我得到同样的错误:无效的 URI 'none://[fe80::5054:ff:fe1f:6b6c%br0]:1500
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 2015-05-11
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-01-25
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多