Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Возможности тулкита GTK+ и сопутствующих библиотек

Низкоуровневые функции для работы с сетью

Автор: A. Панин
Дата публикации: 11 июня 2015 г.

3. Пример использования низкоуровневых функций для работы с протоколом TCP

После рассмотрения API сетевых сокетов и системы разрешения доменных имен библиотеки GIO следует рассмотреть несколько примеров приложений, использующих данные API. Первое приложение предназначено для получения информации о доменном имени по протоколу whois. Протокол whois описан в стандарте RFC 3912 и на данный момент используется повсеместно для получения информации о доменных именах. Данный протокол является, скорее всего, самым простым прикладным текстовым протоколом, использующим транспосртный протокол TCP, и не подразумевает передачу каких-либо метаданных, касающихся разграничения доступа пользователей к данным и формата самих данных, поэтому в большинстве случаев с помощью использующих данный протокол утилит можно получить лишь общедоступную информацию, причем для кодирования текстовой информации используется таблица символов ASCII (но имеются и исключения). В качестве разделителей строк, как и в протоколе HTTP, используются последовательности символов переноса строки и новой строки (\r\n). Для получения текстовой информации о доменном имени клиентское приложение должно отправить по протоколу TCP на порт 43 сервера whois запрос формата "имя_домена\r\n". Процесс получения информации о доменном имени domain.name схематично показан на Рисунке 1.

Процесс получения информации о доменном имени
Рисунок 1 - Процесс получения информации о доменном имени

Единственной сложностью в данном случае является получение списка серверов whois, ведь для получения информации о доменном имени из каждой доменной зоны должен использоваться отдельный сервер whois. К счастью, такой список создан Markus Malkusch и распространяется под свободной лицензией (https://github.com/whois-server-list/whois-server-list). Список серверов является многоуровневым документом формата XML, поэтому в процессе загрузки приложения осуществляется разбор данного документа в рамках функций application_parse_servers_xml(), application_xml_get_end_element(), application_xml_get_value() и application_xml_get_start_element(), а имена доменных зон и серверов whois помещаются в хэш-таблицу (whois_servers) для ускорения поиска имени сервера whois, обслуживающего заданную доменную зону. Имя доменной зоны извлекается из полного имени домена в рамках функции application_get_domain_name() (функция является упрощенной и не обрабатывает дополнительные доменные зоны из списка). Непосредственное получение информации о домене осуществляется в рамках функций application_start_whois_lookup(), application_resolver_lookup_callback() и application_read_callback(), причем первая функция предназначена для инициирования разрешения доменного имени сервера whois, вторая - для соединения с сервером и отправки запроса, а третья - для приема информации от сервера. Получение информации о домене может быть инициировано как с помощью нажатия кнопки Whois (обработчиком является функция application_search_button_clicked()), так и с помощью нажатия клавиши Enter в поле ввода имени домена (обработчик application_domain_entry_activated()), причем в случае ввода домена из зоны, сервера whois для которой нет в списке, деактивируется и кнопка Whois, и обработчик нажатия клавиши Enter в поле ввода имени домена благодаря сохранению соответствующего идентификатора сигнала (domain_entry_activate_signal). Перед завершением работы приложения происходит уничтожение хэш-таблицы с именами доменных зон и серверов whois, причем для освобождения памяти, использованной для хранения соответствующих строк, вызываются функции application_free_server_name() и application_free_domain_name(), заданные на этапе создания хэш-таблицы.

Полный код рассматриваемого приложения приведен в Листинге 1, а также в архиве gwhois вместе с файлом Makefile для упрощения сборки и файлом whois-server-list.xml, являющимся списком серверов whois. Для лучшего понимания в коде приложения используются комментарии. После распаковки архива исходный код может быть скомпилирован либо с помощью команды make, либо с помощью следующей команды:

gcc `pkg-config --cflags --libs gtk+-3.0` `pkg-config --cflags --libs gio-2.0` gwhois.c -o gwhois

При необходимости использованные в приложении низкоуровневые функции для работы с сетью могут быть применены и в не использующем GTK+ консольном приложении, которое может компилироваться с помощью следующей команды:

gcc `pkg-config --cflags --libs glib-2.0` `pkg-config --cflags --libs gio-2.0` <имя файла исходного кода> -o <имя исполняемого файла>

Листинг 1 - Код приложения gwhois

На Рисунке 2 представлен снимок окна приложения gwhois после получения информации о доменном имени kernel.org.

Окно приложения gwhois
Рисунок 2 - Окно приложения gwhois


Продолжение статьи : 4. Пример использования низкоуровневых функций для работы с протоколом UDP.