Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_UNIX.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
347.65 Кб
Скачать

Перевірка буфера

    1. Перевіряється, чи достатня є довжина буфера, наданого програмою, для розміщення в ньому всього запису. Якщо даних не вистачає, то дані зчитуються в буфер частинами по len байтів. Привласнюється змінній errno значення EMSGSIZE і повертає –1.

Зчитування запису

    1. Зчитується сам запис. readvrec повертає –1, 0 чи reclen залежно від того, чи повернула readn код помилки, неповний лічильник нормального значення.

Лістинг 2 Server-сервер, котрий демонструє застосування функції readvrev

1 #include "etcp.h"

2 #define PORTNUM 9000

3 int main( int argc, char **argv )

4 {

5 struct sockaddr_in peer;

6 SOCKET s;

7 SOCKET s1;

8 int peerlen = sizeof( peer );

9 int n;

10 char buf[ 10 ];

11 INIT();

12 if ( argc == 2 )

13 s = tcp_server( NULL, argv[ 1 ] );

14 else

15 s = tcp_server( argv[ 1 ], argv[ 2 ] );

16 s1 = accept( s, ( struct sockaddr * )&peer, &peerlen );

17 if ( !isvalidsock( s1 ) )

18 error( 1, errno, "помилка виклику" );

19 for ( ;; )

20 {

21 n = readvrec( s1, buf, sizeof( buf ) );

22 if ( n < 0)

23 error( 0, errno, "readvrec повернув код помилки" );

24 else if ( n == 0 )

25 error( 1, 0, "client відімкнувся\n" );

26 else

27 write( 1, buf, n );

28 }

29 EXIT( 0 );

30 }

    1. Ініциалізація сервера і прийняття лише одного повідомлення.

    1. Викликається readvrec для читання чергового запису змінної довжини. Якщо відбулася помилка, то друкується діагностичне повідомлення і читається наступний запис. Якщо readvrec повертає EOF, то перечитується повідомлення — й робота завершується.

27 Виведення запису на stdout.

Лістинг 3 Client-клієнт, котрий надсилає записи змінної довжини

1 #include "etcp.h"

2 #define PORTNUM 9000

3 int main( int argc, char **argv )

4 {

5 SOCKET s;

6 int n;

7 struct

8 {

9 u_int32_t reclen;

10 char buf[ 128 ];

11 } packet;

12 INIT();

13 s = tcp_client( argv[ 1 ], argv[ 2 ] );

14 while ( fgets( packet.buf, sizeof( packet.buf ), stdin )

15 != NULL )

16 {

17 n = strlen( packet.buf );

18 packet.reclen = htonl( n );

19 if ( send( s, ( char * )&packet,

20 n + sizeof( packet.reclen ), 0 ) < 0 )

21 error( 1, errno, "send failure" );

22 }

23 EXIT( 0 );

}

    1. Клієнт сполучується із сервером, викликаючи функцію tcp_client.

12, 13 Ініціалізація.

14...22 Викликається fgets для читання рядка зі стандартного введення. Цей рядок розміщується в пакеті повідомлення. Здобуте значення перетвориться на мережний порядок байтів і розміститься в полі reclen пакета. Наприкінці викликається send для надсилання пакета серверові.

Редактор І. В. Ращупкіна

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]