0

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

1 に答える 1

0

ああ、間違った関数を呼び出しています。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

于 2014-01-06T17:27:54.477 に答える