Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

 program_name = argv[0];

 /* Назначение стандартных установок. По умолчанию сервер

связан со всеми локальными адресами, и ему автоматически

назначается неиспользуемый порт. */

 local_address.s_addr = INADDR_ANY;

 port = 0;

 /* He отображать развернутые сообщения. */

 verbose = 0;

 /* Загружать модули из каталога, в котором содержится

исполняемый файл. */

 module_dir = get_self_executable_directory;

 assert(module_dir != NULL);

 /* Анализ опций. */

 do {

next_option =

getopt_long(argc, argv, short_options,

long_options, NULL);

switch (next_option) {

case 'a':

/* Пользователь ввел -a или --address. */

{

struct hostent* local_host_name;

/* Поиск заданного адреса. */

local_host_name = gethostbyname(optarg);

if (local_host_name == NULL ||

local_host_name->h_length == 0)

/* He удалось распознать имя. */

error(optarg, "invalid host name");

else

/* Введено правильное имя */

local_address.s_addr =

*((int*)(local_host_name->h_addr_list[0]));

}

break;

case 'h':

/* Пользователь ввёл -h или --help. */

print_usage(0);

case 'm':

/* Пользователь ввел -m или --module-dir. */

{

struct stat dir_info;

/* Проверка существования каталога */

if (access(optarg, F_OK) != 0)

error(optarg, "module directory does not exist");

/* Проверка доступности каталога. */

if (access(optarg, R_OK | X_OK) != 0)

error(optarg, "module directory is not accessible");

/* Проверка того, что это каталог. */

if (stat(optarg, &dir_info) != 0 || !S_ISDIR(dir_info.st_mode))

error(optarg, "not a directory");

/* Все правильно. */

module_dir = strdup(optarg);

}

break;

case 'p':

/* Пользователь ввел -p или --port. */

{

long value;

char* end;

value = strtol(optarg, &end, 10);

if (*end != '\0')

/* В номере порта указаны не только цифры. */

print_usage(1);

/* Преобразуем номер порта в число с сетевым (обратным)

порядком следования байтов. */

port = (uint16_t)htons(value);

}

break;

case 'v':

/* Пользователь ввел -v или --verbose. */

verbose = 1;

break;

case '?':

/* Пользователь ввел непонятную опцию. */

print_usage(1);

case -1:

/* Обработка опций завершена. */

break;

default:

abort;

}

 } while (next_option != -1);

 /* Программа не принимает никаких дополнительных аргументов.

Если они есть, выдается сообщение об ошибке. */

 if (optind != argc)

print_usage(1);

 /* Отображение имени каталога, если программа работает в режиме

развернутых сообщений. */

 if (verbose)

printf("modules will be loaded from %s\n", module_dir);

 /* Запуск сервера. */

 server_run(local_address, port);

 return 0;

}

Файл

main.c
содержит следующие функции.

■ Функция

getopt_long
(см. раздел 21.3, "Функция getopt_long") вызывается для анализа опций командной строки. Опции могут задаваться в двух форматах: длинном и коротком. Описание длинных опций приведено в массиве
long_options
, а коротких — в массиве
short_options
.

По умолчанию серверный порт имеет номер 0, а локальный адрес задан в виде константы

INADDR_ANY
. Эти установки можно переопределить с помощью опций
– -port
(
– p
) и -
– address
(
– a
) соответственно. Если пользователь ввел адрес, вызывается библиотечная функция
gethostbyname
, преобразующая его в числовой Internet-адрес. [38]

38

При необходимости функция

gethostbyname
осуществляет поиск имен в DNS.

Поделиться:
Популярные книги

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Наследник для дона мафии

Тоцка Тала
2. Наследники мафии
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Наследник для дона мафии

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Князь Целитель 5

Ткачев Андрей Юрьевич
5. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 5

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Князь Целитель 4

Ткачев Андрей Юрьевич
4. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 4

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес