Библиотека сайта rus-linux.net
Возможности тулкита GTK+ и сопутствующих библиотек
Низкоуровневые функции для работы с сетью
Автор: A. Панин
Дата публикации: 11 июня 2015 г.
2. Класс системы разрешения доменных имен GResolver
Как и в случае работы с системным API сокетов, при вызове метода соединения с удаленным узлом или метода отправки дейтаграммы на определенный узел должен передаваться IP-адрес целевого узла, а не имя соответствующего домена. Для получения IP-адресов, соответствующих заданному имени домена, в рамках библиотеки GIO реализован специальный класс системы разрешения доменных имен GResolver. На уровне системного API сокетов для разрешения доменных имен используются функции, блокирующие исполнение приложения или программного потока, поэтому в рамках класса GResolver реализованы механизмы создания программных потоков. Приложение, осуществляющее многократное разрешение доменных имен, может использовать собственную реализацию системы системы разрешения доменных имен с дополнительными механизмами кэширования результатов, причем соответствующий объект типа GResolver будет использоваться приложением по умолчанию после вызова функции g_resolver_set_default(). При этом в большинстве случаев приложение будет отлично работать и со стандартной реализацией системы разрешения доменных имен, представленной объектом, который может быть получен путем вызова функции g_resolver_get_default().
void g_resolver_set_default (GResolver *resolver); GResolver * g_resolver_get_default (void);
Непосредственное разрешение доменных имен осуществляется либо с помощью метода g_resolver_lookup_by_name() в синхронном режиме, либо с помощью методов g_resolver_lookup_by_name_async() и g_resolver_lookup_by_name_finish() в асинхронном режиме.
GList *
g_resolver_lookup_by_name(GResolver *resolver,
const gchar *hostname,
GCancellable *cancellable,
GError **error);
void
g_resolver_lookup_by_name_async(GResolver *resolver,
const gchar *hostname,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GList *
g_resolver_lookup_by_name_finish(GResolver *resolver,
GAsyncResult *result,
GError **error);
Полученные адреса помещаются в двусвязный список типа GList, который может освобождаться как с помощью специального метода g_resolver_free_addresses(), так и вручную (с помощью метода g_list_free_full()). Имя домена передается с помощью аргумента hostname. При работе в асинхронном режиме с помощью аргумента callback метода g_resolver_lookup_by_name_async() должна быть задана функция обратного вызова, в рамках которой для проверки корректности разрешения доменного имени и получения списка IP-адресов должен вызываться метод g_resolver_lookup_by_name_finish(). В приведенных ниже примерах осуществляется разрешение доменных имен в асинхронном режиме. Обратное преобразование IP-адреса в доменное имя может осуществляться с помощью метода g_resolver_lookup_by_address() в синхронном режиме и комбинации методов g_resolver_lookup_by_address_async() и g_resolver_lookup_by_address_finish() в асинхронном режиме.
gchar *
g_resolver_lookup_by_address(GResolver *resolver,
GInetAddress *address,
GCancellable *cancellable,
GError **error);
void
g_resolver_lookup_by_address_async(GResolver *resolver,
GInetAddress *address,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gchar *
g_resolver_lookup_by_address_finish(GResolver *resolver,
GAsyncResult *result,
GError **error);
Очевидно, что IP-адрес передается с помощью аргумента address.
Поиск сервисов, объявленных в рамках записей SRV домена, по названиям и протоколам может осуществляться с помощью метода g_resolver_lookup_service() в синхронном режиме и комбинации методов g_resolver_lookup_service_async() и g_resolver_lookup_service_finish() в асинхронном режиме.
GList *
g_resolver_lookup_service(GResolver *resolver,
const gchar *service,
const gchar *protocol,
const gchar *domain,
GCancellable *cancellable,
GError **error);
void
g_resolver_lookup_service_async(GResolver *resolver,
const gchar *service,
const gchar *protocol,
const gchar *domain,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GList *
g_resolver_lookup_service_finish(GResolver *resolver,
GAsyncResult *result,
GError **error);
В данном случае имя сервиса передается с помощью аргумента service, название протокола - с помощью аргумента protocol, а имя домена - с помощью аргумента domain. Полученный список сервисов может быть уничтожен с помощью вспомогательного метода g_resolver_free_targets() или вручную.
void g_resolver_free_targets (GList *targets);
Наконец, список ресурсных записей домена может быть получен с помощью метода g_resolver_lookup_records() в синхронном режиме и с помощью комбинации методов g_resolver_lookup_records_async() и g_resolver_lookup_records_finish() в асинхронном режиме.
GList *
g_resolver_lookup_records(GResolver *resolver,
const gchar *rrname,
GResolverRecordType record_type,
GCancellable *cancellable,
GError **error);
void
g_resolver_lookup_records_async(GResolver *resolver,
const gchar *rrname,
GResolverRecordType record_type,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GList *
g_resolver_lookup_records_finish(GResolver *resolver,
GAsyncResult *result,
GError **error);
Здесь с помощью аргумента rrname передается имя домена, а с помощью аргумента record_type - идентификатор ресурсной записи домена. Функции возвращают список из кортежей, каждый из которых упакован в контейнер типа GVariant (допустимые идентификаторы ресурсных записей домена и описания возвращаемых кортежей приведены в таблице ниже).
Таблица 5 - Ресурсные записи доменов
| Ресурсная запись домена | Идентификатор записи | Описание кортежа |
|---|---|---|
| SRV - Запись с информацией для выбора сервера (Server selection, RFC 2782) | G_RESOLVER_RECORD_SRV |
(qqqs) - (приоритет, важность, порт, имя узла) |
| MX - Запись с информацией о почтовом шлюзе (Mail Exchanger, RFC 1035) | G_RESOLVER_RECORD_MX |
(qs) - (приоритет, имя сервера электронной почты) |
| TXT - Текстовая запись (Text string, RFC 1035) | G_RESOLVER_RECORD_TXT |
(as) - (массив строк текста) |
| SOA - Запись с информацией о сервере, хранящем эталонные данные (Start of authority, RFC 1035) | G_RESOLVER_RECORD_SOA |
(ssuuuuu) - (имя основного сервера имен, имя администратора, идентификатор, интервал обновления, интервал повтора, период актуальности информации, TTL) |
| NS - Запись с информацией о сервере DNS, обслуживающем домен (Authoritative name server, RFC 1035) | G_RESOLVER_RECORD_NS |
(s) - имя узла сервера |
Продолжение статьи : 3. Пример использования низкоуровневых функций для работы с протоколом TCP.
