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
рейтинг книги
Жребий некроманта 2
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Безымянный раб
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Я тебя не отпускал
2. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.55
рейтинг книги
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
СД. Том 15
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
Идеальный мир для Лекаря 10
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Третий
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Идеальный мир для Социопата 6
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Огни Аль-Тура. Завоеванная
4. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Жена по ошибке
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Я – Орк. Том 4
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Чехов. Книга 3
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00