Читаем UNIX: разработка сетевых приложений полностью

11  while ((с = getopt(argc, argv, "gG")) != -1) {

12   switch (c) {

13   case 'g': /* свободный маршрут от отправителя */

14    if (ptr)

15     err_quit("can't use both -g and -G");

16    ptr = inet_srcrt_init(0);

17    break;

18   case 'G': /* жесткий маршрут от отправителя */

19    if (ptr)

20     err_qint("can't use both -g and -G");

21    ptr = inet_srcrt_init(1);

22    break;

23   case '?':

24    err_quit("unrecognized option: %c", c);

25   }

26  }

27  if (ptr)

28   while (optind argc-1)

29    len = inet_srcrt_add(argv[optind++]);

30  else if (optind argc-1)

31   err_quit("need -g or -G to specify route");

32  if (optind != argc-1)

33   err_quit("missing hostname");

34  ai = Host_serv(argv[optind], SERV_PORT_STR, AF_INET, SOCK_STREAM);

35  sockfd = Socket(ai-ai_family, ai-ai_socktype, ai-ai_protocol);

36  if (ptr) {

37   len = inet_srcrt_add(argv[optind]); /* получатель в конце */

38   Setsockopt(sockfd, IPPROTO_IP, IP_OPTIONS, ptr, len);

39   free(ptr);

40  }

41  Connect(sockfd, ai-ai_addr, ai-ai_addrlen);

42  str_cli(stdin, sockfd); /* вызов рабочей функции */

43  exit(0);

44 }

Обработка аргументов командной строки

12-26 Мы вызываем нашу функцию inet_srcrt_init, чтобы инициализировать маршрут от отправителя. Тип маршрутизации указывается при помощи параметра -g(свободная) или -G(жесткая).

27-33 Если указатель ptrустановлен, значит, был указан параметр маршрутизации от отправителя, и все указанные промежуточные узлы добавляются к маршруту, подготовленному на предыдущем этапе функцией inet_srcrt_add. Если же ptrне установлен, но в командной строке еще есть аргументы, значит, пользователь задал маршрут, но не указал его тип. В этом случае программа завершает работу с сообщением об ошибке.

Обработка адреса получателя и создание сокета

34-35 Последний аргумент командной строки — это имя узла или адрес сервера в точечно-десятичной записи, который обрабатывается нашей функцией host_serv. Мы не можем вызвать функцию tcp_connect, так как должны задать маршрут от отправителя между вызовом функций socketи connect. Последняя инициирует трехэтапное рукопожатие, а нам нужно, чтобы сегмент SYN отправителя и все последующие пакеты проходили по одному и тому же маршруту.

36-42 Если маршрут от отправителя задан, следует добавить IP-адрес сервера в конец списка адресов (см. рис. 27.1). Функция setsockoptустанавливает маршрут от отправителя для данного сокета. Затем мы вызываем функцию connect, а потом — нашу функцию str_cli(см. листинг 5.4).

Наш TCP-сервер имеет много общего с кодом, показанным в листинге 5.9, но содержит следующие изменения.

Во-первых, мы выделяем место для параметров:

int len;

u_char *opts;

opts = Malloc(44);

Во-вторых, мы получаем параметры IP после вызова функции accept, но перед вызовом функции fork:

len = 44;

Getsockopt(connfd, IPPROTO_IP, IP_OPTIONS, opts, len);

if (len 0) {

 printf("received IP options, len = %d\n", len);

 inet_srcrt_print(opts, len);

}

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT