【发布时间】: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 地址之一...跨度>