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

на главную

Жанры

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

8 int *from_len, struct sctp_sndrcvinfo *sri, int *msg_flags)

9 {

10 int rdsz, left, at_in_buf;

11 int frmlen=0;

12 if (sctp_pdapi_readbuf == NULL) {

13 sctp_pdapi_readbuf = (uint8_t*)Malloc(SCTP_PDAPI_INCR_SZ);

14 sctp_pdapi_rdbuf_sz = SCTP_PDAPI_INCR_SZ;

15 }

16 at_in_buf = Sctp_recvmsg(sock_fd, sctp_pdapi_readbuf, sctp_pdapi_rdbuf_sz,

17 from, from_len,

18 sri.msg_flags);

19 if (at_in_buf < 1) {

20 *rdlen = at_in_buf;

21 return(NULL);

22 }

23 while ((*msg_flags & MSG_EOR) == 0) {

24 left = sctp_pdapi_rdbuf_sz = at_in_buf;

25 if (left < SCTP_PDAPI_NEED_MORE_THRESHOLD) {

26 sctp_pdapi_readbuf =

27 realloc(sctp_pdapi_readbuf,

28 setp_pdapi_rdbuf_sz + SCTP_PDAPI_INCR_SZ);

29 if (sctp_pdapi_readbuf == NULL) {

30 err_quit("sctp_pdapi ran out of memory");

31 }

32 sctp_pdapi_rdbuf_sz += SCTP_PDAPI_INCR_SZ;

33 left = sctp_pdapi_rdbuf_sz - at_in_buf;

34

35 rdsz = Sctp_recvmsg(sock_fd, &sctp_pdapi_readbuf[at_in_buf],

36 left, NULL, &frmlen, NULL, msg_flags);

37 at_in_buf += rdsz;

38 }

39 *rdlen = at_in_buf;

40 return(sctp_pdapi_readbuf);

41 }

Подготовка
статического буфера

12-15
Если статический буфер не выделен, функция выделяет его и инициализирует переменную, хранящую информацию о состоянии этого буфера.

Чтение сообщения

16-18
Первое сообщение считывается из сокета вызовом
sctp_recvmsg
.

Обработка ошибки чтения

19-22
Если
sctp_recvmsg
возвращает ошибку или признак конца файла EOF, соответствующий код возвращается вызвавшему нашу функцию процессу без
всяких изменений.

Если сообщение считано не полностью

23-24
Если флаги сообщения показывают, что оно было считано не полностью, мы вызываем функцию
sctp_recvmsg
снова. Предварительно мы вычисляем объем свободного места в буфере.

Проверка необходимости увеличения статического буфера

25-34
Если остаток приемного буфера оказался меньше некоторого минимального значения, этот буфер необходимо увеличить. С этой целью мы вызываем функцию
realloc
, выделяющую буфер большего размера, после чего копируем в новый буфер данные из старого буфера. Если по какой-то причине размер буфера не может быть увеличен, функция завершает свою работу с выводом сообщения об ошибке.

Получение данных

35-36
Новые данные считываются из буфера вызовом
sctp_recvmsg
.

Шаг вперед

37-38
Функция увеличивает индекс буфера, после чего возвращается на проверку полного считывания сообщения.

После завершения цикла

39-40
После завершения цикла функция копирует количество считанных байтов в буфер, указатель на который передается ей вызвавшим процессом, и возвращает этому процессу указатель на собственный буфер.

Теперь мы можем изменить сервер SCTP таким образом, чтобы он использовал нашу новую функцию. Новый код представлен в листинге 23.3.

Листинг 23.3. Сервер SCTP, использующий API частичной доставки

//sctp/sctpserv05.c

26 for (;;) {

27 len = sizeof(struct sockaddr_in);

28 bzero(&sri,.sizeof(sri));

29 readbuf = pdapi_recvmsg(sock_fd, &rd_sz,

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

31 if (readbuf == NULL)

32 continue;

Чтение сообщения

29-30
Сервер вызывает новую функцию-обертку интерфейса частичной доставки. Предварительно обнуляется переменная
sri
.

Проверка наличия считанных данных

31-32
Обратите внимание, что теперь серверу приходится проверять объем буфера, чтобы убедиться, что чтение было успешным. Если буфер оказывается нулевым, программа переходит на начало цикла.

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

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

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

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

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Я тебя не отпускал

Рам Янка
2. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.55
рейтинг книги
Я тебя не отпускал

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

СД. Том 15

Клеванский Кирилл Сергеевич
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
СД. Том 15

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Огни Аль-Тура. Завоеванная

Макушева Магда
4. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Аль-Тура. Завоеванная

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3