Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

39 { "SO_USELOOPBACK", SOL_SOCKET, SO_USELOOPBACK, sock_str_flag },

40 { "IP_TOS", IPPROTO_IP, IP_TOS, sock_str_int },

41 { "IP_TTL", IPPROTO_IP, IP_TTL, sock_str_int },

42 { "IPV6_DONTFRAG", IPPROTO_IPV6, IPV6_DONTFRAG, sock_str_flag },

43 { "IPV6_UNICAST_HOPS", IPPROTO_IPV6, IPV6_UNICAST_HOPS, sock_str_int },

44 { "IPV6_V6ONLY", IPPROTO_IPV6, IPV6_V6ONLY, sock_str_flag },

45 { "TCP_MAXSEG", IPPROTO_TCP, TCP_MAXSEG, sock_str_int },

46 { "TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, sock_str_flag },

47 { "SCTP_AUTOCLOSE", IPPROTO_SCTP, SCTP_AUTOCLOSE, sock_str_int },

48 { "SCTP_MAXBURST", IPPROTO_SCTP, SCTP_MAXBURST, sock_str_int },

49 { "SCTP_MAXSEG", IPPROTO_SCTP, SCTP_MAXSEG, sock_str_int },

50 { "SCTP_NODELAY", IPPROTO_SCTP, SCTP_NODELAY, sock_str_flag },

51 { NULL, 0, 0, NULL }

52 };

Объявление объединения возможных значений

3-9
Наше объединение
val
содержит по одному элементу для каждого возможного возвращаемого значения из функции
getsockopt
.

Задание прототипов функций

10-13
Мы определяем прототипы для четырех функций, которые вызываются для вывода значения данного параметра сокета.

Задание структуры и инициализация массива

14-46
Наша структура
sock_opts
содержит всю информацию, которая необходима, чтобы вызвать функцию
getsockopt
для каждого из параметров сокета и вывести его текущее значение. Последний элемент,
opt_val_str
, является указателем на одну из четырех функций, которые выводят значение параметра. Мы размещаем в памяти и инициализируем массив этих структур, каждый элемент которого соответствует одному параметру сокета.

ПРИМЕЧАНИЕ

Не все реализации поддерживают полный набор параметров сокетов. Чтобы определить, поддерживается ли данный параметр, следует использовать #ifdef или #if defined, как показано для параметра SO_REUSEPORT. Для полноты картины требуется обработать подобным образом все параметры, но в книге мы пренебрегаем этим, потому что #ifdef только удлиняет показанный код и не влияет на суть дела.

В листинге 7.2 показана наша функция

main
.

Листинг 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);

  • Читать дальше
  • 1
  • ...
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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