Библиотека сайта 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.
Рисунок 2 - Окно приложения gwhois
Продолжение статьи : 4. Пример использования низкоуровневых функций для работы с протоколом UDP.