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;
}