Эффективное программирование TCP-IP


         

Функция для чтения записи переменной


Листинг 2.13. Функция для чтения записи переменной длины
1    int readvrec( SOCKET fd, char *bp, size_t len )
2    {
3    u_int32_t reclen;
4    int rc;
5    /* Прочитать длину записи. */
6    rc = readn( fd, ( char * )&reclen, sizeof( u_int32_t ) );
7    if ( rc != sizeof( u_int32_t ) )
8      return rc < 0 ? -1 : 0;
9    reclen = ntohl( reclen );
10   if ( reclen > len )
11   {
12     /*
13     * He хватает места в буфере для•размещения данных
14     * отбросить их и вернуть код ошибки.
15     */
16     while ( reclen > 0 )
17     {
18      rc = readn( fd, bp, len );
19      if ( rc != len )
20       return rc < 0 ? -1 : 0;
21      reclen -= len;
22      if ( reclen < len }
23       len = reclen;
24     }
25     set_errno( EMSGSIZE };
26     return -1;
27   }
28   /* Прочитать саму запись */
29   rc = readn( fd, bp, reclen );
30   if ( rc != reclen )
31     return rc < 0 ? -1 : 0;
32   return rc;
33   }
Чтение длины записи
6-8 Длина записи считывается в переменную reclen. Функция readvrec возвращает 0 (конец файла), если число байтов, прочитанных readn, не точно совпадает с размером целого, или -1 в случае ошибки. 1
9 Размер записи преобразуется из сетевого порядка в машинный. Подробнее об этом рассказывается в совете 28.
Проверка того, поместится ли запись в буфер
10-27 Проверяется, достаточна ли длина буфера, предоставленного вызывающей программой, для размещения в нем всей записи. Если места не хватит, то данные считываются в буфер частями по 1en байт, то есть, по сути, отбрасываются. Изъяв из потока отбрасываемые данные, функции присваивает переменной errno значение EMSGSIZE и возвращает -1.
Считывание записи
29-32 Наконец считывается сама запись, readvrec возвращает-1, 0 или reclen в зависимости от того, вернула ли readn код ошибки, неполный счетчик или нормальное значение.
Поскольку readvrec - функция полезная и ей найдется применение, необходимо записать ее прототип:
#include "etcp.h"

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий