Указание интерфейса ipv6 с помощью glib/gio

Я пытаюсь использовать библиотеку 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;
}

person mjohnson    schedule 03.01.2014    source источник
comment
Адрес выглядит правильно в вашем первом примере. Но none:// явно не прав. Вам может понадобиться показать код здесь.   -  person Michael Hampton    schedule 04.01.2014
comment
Да, вам нужно показать код. Я попробовал это сам и смог успешно установить соединение. Даже скобки не понадобились.   -  person Michael Hampton    schedule 04.01.2014
comment
Я добавил код. Все тестовые строки приводят к недопустимому URI.   -  person mjohnson    schedule 06.01.2014
comment
Добавил полную программу, к сожалению она у меня пока не работает.   -  person mjohnson    schedule 07.01.2014
comment
Я запустил программу как указано (хотя я изменил номер порта) и получил: $ ./a.out Connection successful! Имейте в виду, что это один из моих IP-адресов...   -  person Michael Hampton    schedule 07.01.2014


Ответы (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 пример

person Michael Hampton    schedule 06.01.2014
comment
Да, это пример, из которого я взял этот код. Я должен был включить ссылку. Так это действительно работает для вас? Я получаю: (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' failed` ** (process:9392): ERROR **: Unknown error on connect - person mjohnson; 06.01.2014
comment
Боюсь, я дословно скопировал ваш код. Причина, по которой я первоначально переключился на вызов функции *_to_uri, заключается в том, что это то, что вызывает функция *_to_host. Я просто вырезал посредника. Интересно, что это работает для вас, а не для меня. Я пробовал это на Ubuntu 12.04 и Debian Wheezy. Могу я спросить, какую систему вы используете? - person mjohnson; 06.01.2014
comment
Я использую Fedora 20. Обычно я держусь подальше от Debian/Ubuntu по разным причинам. - person Michael Hampton; 06.01.2014
comment
Попробовал ваш код на компьютере с Fedora 19. Я получаю ту же ошибку: Invalid URI 'none://[fe80::5054:ff:fe1f:6b6c%br0]:1500 - person mjohnson; 07.01.2014