Читаем Разработка приложений в среде Linux. Второе издание полностью

42: setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));

Linux-реализация TCP, как и в остальных системах Unix, вводит ограничения на то, насколько скоро можно повторно использовать кортеж (локальный хост, локальный порт)[136]. Этот код устанавливает опцию на сокет, которая обходит это ограничение и позволяет дважды запускать сервер за короткий период времени. По сходной причине сервер-пример сокета домена Unix удаляет любой существующий файл сокета, прежде чем вызывать bind().

Функция setsockopt() позволяет устанавливать множество специальных опций для сокета и протокола:

#include

int setsockopt(int sock, int level, int option,

 const void * valptr, int vallength);

Первый аргумент — это сокет, для которого определяется опция. Второй аргумент, level, указывает тип устанавливаемой опции. В нашем сервере используется SOL_SOCKET, что указывает на установку опции обобщенного сокета. Параметр option определяет опцию, которая подлежит изменению. Указатель на новое значение опции передается через valptr, а размер значения, на которое указывает valptr, передается как vallength. Для нашего сервера применяется указатель на ненулевое целое число, которое вводит в действие опцию SO_REUSEADDR.

<p>17.5.8. Клиентские приложения TCP</p>

Клиенты TCP подобны клиентам домена Unix. Как правило, сразу же после создания сокета, клиент подключается к серверу с помощью функции connect(). Единственное различие состоит в способе передачи адреса в connect(). Вместо того, чтобы использовать имя файла, большинство клиентов TCP отыскивают имя хоста через функцию getaddrinfo(), которая предоставляет информацию для connect().

Ниже приводится несложный TCP-клиент, который взаимодействует с сервером, представленным в предыдущем разделе. Он принимает один аргумент: имя хоста, на котором работает сервер, или его IP-номер (в десятичном представлении с разделительными точками). Во всем остальном программа ведет себя также как клиент сокета домена Unix, показанный ранее в этой главе.

 1: /* tclient.с */

 2:

 3: /* Подключиться к серверу, чье имя хоста или IP-адрес переданы в качестве

 4: аргумента, на порте 4321. После соединения скопировать все содержимое

 5: stdin в сокет, затем завершить работу. */

 6:

 7: #include

 8: #include

 9: #include

10: #include

11: #include

12: #include

13: #include

14: #include

15:

16: #include "sockutil.h" /* некоторые служебные функции */

17:

18: int main(int argc, const char ** argv) {

19:  struct addrinfo hints, *addr;

20:  struct sockaddr_in * addrinfo;

21:  int rc;

22:  int sock;

23:

24:  if (argc !=2) {

25:   fprintf(stderr, "поддерживается только одиночный аргумент\n");

26:   return 1;

27:  }

28:

29:  memset(&hints, 0, sizeof(hints));

30:

31:  hints.ai_socktype = SOCK_STREAM;

32:  hints.ai_flags = AI_ADDRCONFIG;

33:  if ((rc = getaddrinfo(argv[1], NULL, &hints, &addr))) {

34:   fprintf(stderr, "сбой поиска имени хоста: %s\n",

35:   gai_strerror(rc));

36:   return 1;

37:  }

38:

39:  /* это позволяет получить доступ к sin_family и sin_port

40:     (которые расположены там же, где и sin6_family и sin6_port) */

41:  addrinfo = (struct sockaddr_in *) addr->ai_addr;

42:

43:  if ((sock = socket(addrInfo->sin_family, addr->ai_socktype,

44:   addr->ai_protocol)) < 0)

45:   die("socket");

46:

47:  addrInfo->sin_port = htons(4321);

48:

49:  if (connect(sock, (struct sockaddr *) addrinfo,

50:   addr->ai_addrlen))

51:   die("connect");

52:

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

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

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

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

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

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

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

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