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

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

Жанры

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

Троан Эрик В.

Шрифт:

51:

52: while ((conn = accept(sock, (struct sockaddr *) &address,

53: &addrLength)) >=0) {

54: printf("----получение данных\n");

55: copyData(conn, 1);

56: printf("----готово\n");

57: close(conn);

58: }

59:

60: if (conn < 0)

61: die("accept");

62:

63: close(sock);

64: return 0;

65: }

Обратите

внимание на то, что IP-адрес, привязанный к сокету, указывает номер порта 4321, но не IP-адрес. Это предоставляет ядру возможность при необходимости воспользоваться локальным IP-адресом.

Код в строках 41–42 требует дополнительного объяснения.

41: i = 1;

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

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

bind
.

136

Для TCP-портов данная комбинация не может использоваться в течение двух минут.

Функция

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

#include <sys/socket.h>

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

 const void * valptr, int vallength);

Первый аргумент — это сокет, для которого определяется опция. Второй аргумент,

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

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

Клиенты TCP подобны клиентам домена Unix. Как правило, сразу же после создания сокета, клиент подключается к серверу с помощью функции

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

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

 1: /* tclient.с */

 2:

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

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

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

 6:

 7: #include <arpa/inet.h>

 8: #include <netdb.h>

 9: #include <netinet/in.h>

10: #include <stdio.h>

11: #include <stdlib.h>

12: #include <string.h>

13: #include <sys/socket.h>

14: #include <unistd.h>

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:

53: freeaddrinfo(addr);

54:

55: copyData(0, sock);

56:

57: close(sock);

58:

59: return 0;

60: }

17.6. Использование дейтаграмм UDP

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

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

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

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

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

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

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

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

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник