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

на главную

Жанры

UNIX: разработка сетевых приложений
Шрифт:

Листинг 7.2. Функция main для проверки параметров сокетов

//sockopt/checkopts.c

53 int

54 main(int argc, char **argv)

55 {

56 int fd;

57 socklen_t len;

58 struct sock_opts *ptr;

59 for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {

60 printf("%s: ptr->opt_str);

61 if (ptr->opt_val_str == NULL)

62 printf("(undefined)\n");

63 else {

64 switch(ptr->opt_level) {

65 case SOL_SOCKET:

66 case IPPROTO_IP:

67 case IPPROTO_TCP:

68 fd = Socket(AF_INET, SOCK_STREAM, 0);

69 break;

70 #ifdef IPV6

71 case IPPROTO_IPV6:

72 fd = Socket(AF_INET6, SOCK_STREAM, 0);

73 break;

74 #endif

75 #ifdef IPPROTO_SCTP

76 case IPPROTO_SCTP:

77 fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

78 break;

79 #endif

80 default:

81 err_quit("Can't create fd for level %d\n", ptr->opt_level);

82 }

83 len = sizeof(val);

84 if (getsockopt(fd, ptr->opt_level, ptr->opt_name,

85 &val, &len) == -1) {

86 err_ret("getsockopt error");

87 } else {

88 printf("default = %s\n", (*ptr->opt_val_str)(&val, len));

89 }

90 close(fd);

91 }

92 }

93 exit(0);

94 }

Перебор
всех параметров

59-63
Мы перебираем все элементы нашего массива. Если указатель
opt_val_str
пустой, то параметр не определен реализацией (что, как мы показали, возможно для
SO_REUSEPORT
).

Создание
сокета

63-82
Мы создаем сокет, на котором проверяем действие параметров. Для проверки параметров сокета и уровней IPv4 и TCP мы используем сокет IPv4 TCP. Для проверки параметров сокетов уровня IPv6 мы используем сокет IPv6 TCP, а для проверки параметров SCTP — сокет IPv4 SCTP.

Вызов функции getsockopt

83-87
Мы вызываем функцию
getsockopt
, но не завершаем ее выполнение, если возвращается ошибка. Многие реализации определяют имена некоторых параметров сокетов, даже если не поддерживают эти параметры. Неподдерживаемые параметры выдают ошибку
ENOPROTOOPT
.

Вывод значения параметра по умолчанию

88-89
Если функция
getsockopt
успешно завершается, мы вызываем нашу функцию для преобразования значения параметра в строку и выводим эту строку.

В листинге 7.1 мы показали четыре прототипа функций, по одному для каждого типа возвращаемого значения параметра. В листинге 7.3 показана одна из этих функций,

sock_str_flag
, которая выводит значение параметра, являющегося флагом. Другие три функции аналогичны этой.

Листинг 7.3. Функция sock_str_flag: преобразование флага в строку

//sockopt/checkopts.с

95 static char strres[128];

96 static char *

97 sock_str_flag(union val *ptr, int len)

98 {

99 if (len != sizeof(int))

100 snprint(strres, sizeof(strres), "size (%d) not sizeof(int)", len);

101 else

102 snprintf(strres, sizeof(strres),

103 "%s", (ptr->i_val == 0) ? "off" : "on");

104 return(strres);

105 }

99-104
Вспомните, что последний аргумент функции
getsockopt
— это аргумент типа «значение-результат». Первое, что мы проверяем, — это то, что размер значения, возвращаемого функцией
getsockopt
, совпадает с предполагаемым. В зависимости от того, является ли значение флага нулевым или нет, возвращается строка
off
или
on
.

Выполнение этой программы под FreeBSD 4.8 с пакетами обновлений KAME SCTP дает следующий вывод:

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

Идущий в тени 4

Амврелий Марк
4. Идущий в тени
Фантастика:
боевая фантастика
6.58
рейтинг книги
Идущий в тени 4

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Метка драконов. Княжеский отбор

Максименко Анастасия
Фантастика:
фэнтези
5.50
рейтинг книги
Метка драконов. Княжеский отбор

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Темный охотник 6

Розальев Андрей
6. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный охотник 6

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Все еще не Герой!. Том 2

Довыдовский Кирилл Сергеевич
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Все еще не Герой!. Том 2

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

Попаданка в деле, или Ваш любимый доктор - 2

Марей Соня
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Чемпион

Демиров Леонид
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38
рейтинг книги
Чемпион