КЛІЄНТ-СЕРВЕРНОЇ АРХІТЕКТУРИ
Лістинг 1 Функція для читання запису змінної довжини (readvrec)
1 #include "../etcp.h"
2 int readvrec( SOCKET fd, char *bp, size_t len )
3 {
4 u_int32_t reclen;
5 int rc;
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 while ( reclen > 0 )
13 {
14 rc = readn( fd, bp, len );
15 if ( rc != len )
16 return rc < 0 ? -1 : 0;
17 reclen -= len;
18 if ( reclen < len )
19 len = reclen;
20 }
21 set_errno( EMSGSIZE );
22 return -1;
23 }
24 rc = readn( fd, bp, reclen );
25 if ( rc != reclen )
26 return rc < 0 ? -1 : 0;
27 return rc;
28 }
6...8 Довжина запису зчитується у змінну reclen. Функція readvrec повертає 0 (завершення файла), якщо число байтів, прочитаних readn, неповністю збігається з розміром цілого, чи 1 — у разі помилки.
9 Розмір запису перетвориться з мережного порядку на машинний.
Перевірка буфера
10...23 Перевіряється, чи достатня є довжина буфера, наданого програмою, для розміщення в ньому всього запису. Якщо даних не вистачає, то дані зчитуються в буфер частинами по len байтів. Привласнюється змінній errno значення EMSGSIZE і повертає –1.
Зчитування запису
24..27 Зчитується сам запис. readvrec повертає –1, 0 чи reclen залежно від того, чи повернула readn код помилки, неповний лічильник нормального значення.