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

на главную

Жанры

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

1. Клиент считывает строку текста из стандартного потока ввода и отсылает ее серверу. Строка имеет формат

[#]text
, где номер в скобках обозначает номер потока SCTP, по которому должно быть отправлено это текстовое сообщение.

2. Сервер принимает текстовое сообщение из сети, увеличивает номер потока, по которому было получено сообщение, на единицу и отправляет сообщение обратно клиенту через поток с новым номером.

3. Клиент считывает полученную строку и выводит ее в стандартный поток вывода, добавляя к ней номер потока и порядковый номер для данного потока.

Наше приложение вместе с функциями, используемыми

для операций ввода и вывода, изображено на рис. 10.1.

Рис. 10.1. Простое потоковое приложение SCTP с архитектурой клиент-сервер

Две стрелки между клиентом и сервером обозначают два однонаправленных потока (ассоциация в целом является полностью двусторонней). Функции

fgets
и
fputs
входят в стандартную библиотеку ввода-вывода. Мы не пользуемся функциями
writen
и
readline
из раздела 3.9, потому что в них нет необходимости. Вместо них мы вызываем
sctp_sendmsg
и
sctp_recvmsg
из разделов 9.9 и 9.10 соответственно.

Сервер в нашем примере будет относиться к типу «один-ко-многим». Этот вариант был выбран нами по одной важной причине. Примеры из главы 5 могут быть переделаны под SCTP внесением крайне незначительных изменений: достаточно изменить вызов socket, указав в качестве третьего аргумента

IPPROTO_SCTP
вместо
IPPROTO_TCP
. Однако приложение, полученное таким образом, не использовало бы дополнительные возможности, предоставляемые SCTP, за исключением поддержки многоинтерфейсных узлов. Написав сервер типа «один-ко-многим», мы смогли показать все достоинства SCTP.

10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main

Наши клиент и сервер SCTP вызывают функции в последовательности, представленной на рис. 9.2. Код последовательного сервера представлен в листинге 10.1 [1] .

Листинг 10.1. Потоковый эхо-сервер SCTP

//sctp/sctpserv01.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

4 {

5 int sock_fd, msg_flags;

6 char readbuf[BUFFSIZE];

7 struct sockaddr_in servaddr, cliaddr;

8 struct sctp_sndrcvinfo sri;

9 struct sctp_event_subscribe evnts;

10 int stream_increment=1;

11 socklen_t len;

12 size_t rd_sz;

13 if (argc == 2)

14 stream_increment = atoi(argv[1]);

15 sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

16 bzero(&servaddr, sizeof(servaddr));

17 servaddr.sin_family = AF_INET;

18 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

19 servaddr.sin_port = htons(SERV_PORT);

20 Bind(sock_fd, (SA*)&servaddr, sizeof(servaddr));

21 bzero(&evnts, sizeof(evnts));

22 evnts.sctp_data_io_event = 1;

23 Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));

24 Listen(sock_fd, LISTENQ);

25 for (;;) {

26 len = sizeof(struct sockaddr_in);

27 rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),

28 (SA*)&cliaddr, &len, &sri, &msg_flags);

29 if (stream_increment) {

30 sri.sinfo_stream++;

31 if (sri.sinfo_stream >=

32 sctp_get_no_strms(sock_fd, (SA*)&cliaddr, len))

33 sri.sinfo_stream = 0;

34 }

35 Sctp_sendmsg(sock_fd, readbuf, rd_sz,

36 (SA*)&cliaddr, len,

37 sri.sinfo_ppid,

38 sri.sinfo_flags, sri.sinfo_stream, 0, 0);

39 }

40 }

Настройка
приращения номера потока

13-14
По умолчанию наш сервер отвечает клиенту через поток, номер которого на единицу больше номера потока, по которому было получено сообщение. Если приложению в строке вызова передается целочисленный аргумент, он интерпретируется как значение флага
stream_increment
, с помощью которого приращение номера потока можно отключить. Мы воспользуемся этим параметром командной строки, когда будем говорить о блокировании в разделе 10.5.

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

15
Создается сокет SCTP типа «один-ко-многим».

Связывание с адресом

16-20
Структура адреса сокета Интернета заполняется универсальным адресом (
INADDR_ANY
) и номером заранее известного порта сервера
SERV_PORT
. Связывание с универсальным адресом означает, что конечная точка SCTP будет использовать все доступные локальные адреса для всех создаваемых ассоциаций. Для многоинтерфейсных узлов это означает, что удаленная конечная точка сможет устанавливать ассоциации и передавать пакеты на любой локальный интерфейс. Выбор номера порта SCTP основывался на рис. 2.10. Обратите внимание, что ход рассуждений для сервера тот же, что и в одном из предшествовавших примеров в разделе 5.2.

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

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Эйгор. В потёмках

Кронос Александр
1. Эйгор
Фантастика:
боевая фантастика
7.00
рейтинг книги
Эйгор. В потёмках

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

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

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

Восьмое правило дворянина

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

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

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

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

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Штурм Земли

Семенов Павел
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Штурм Земли

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая