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


         

и подсчитывает поступающие байты, пока


19       break;

20      case ".?" :

21       error( 1, 0, "недопустимая опция: %c\n", с );

22     }

23   }

24   set_address( NULL, "9000", &local, "tcp" );

25   s = socket( AF_INET, SOCK_STREAM, 0 );

26   if ( !isvalidsock( s ) )

27     error( 1, errno, "ошибка вызова socket" ) ;

28   if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR,

29     ( char * )&on, sizeof( on ) ) )

30     error( 1, errno, "ошибка вызова setsockopt SO_REUSEADDR")

31   if ( setsockopt( s, SOL_SOCKET, SO_RCVBUF,

32     ( char * )&rcvbufsz, sizeof( rcvbufsz ) ) )

33     error( 1, errno, "ошибка вызова setsockopt SO_RCVBUF")

34   if ( bind( s, ( struct sockaddr * ) &local,

35     sizeof( local ) ) )

36.    error ( 1, errno, "ошибка вызова bind" ) ;

37   listen( s, 5 );

38   do

39   {

40     peerlen = sizeof( peer );

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

42     if ( !isvalidsock( s1 ) )

43      error( 1, errno, "ошибка вызова accept" );

44     server( s1, rcvbufsz );

45     CLOSE( s1 );

46   } while ( 0 );

47   EXIT( 0 );

48   }

Функция server читает и подсчитывает поступающие байты, пока не обнаружит конец файла (совет 16) или не возникнет ошибка. Она выделяет память под буфер того же размера, что и буфер приема сокета, чтобы прочитать максимальное количество данных за одно обращение к recv. Текст функции server приведен в листинге 2.20.

Листинг 2.20. Функция server



1    static void server(   SOCKET  s, int rcvbufsz )

2    {

3    char  *buf;

4    int rc;

5    int bytes =0;

6    if ( ( buf   =  malloc( rcvbufsz ) ) == NULL )

7      error( 1, 0, "ошибка  вызова malloc\n"};

8    for ( ; ;  )

9    {

10     rc = recv( s, buf, rcvbufsz, 0 );

11     if ( rc <= 0 )

12      break;

13     bytes += rc;

14   }

15   error( 0, 0, "получено байт: %d\n", bytes );

16   }

Для измерения сравнительной производительности протоколов TCP и UDP при передаче больших объемов данных запустим клиента на машине bsd, а сервер- на localhost. Физически хосты bsd localhost - это, конечно, одно и то же, но, как вы увидите, результаты работы программы в значительной степени зависят от того, какое из этих имен использовано. Сначала запустим клиента и сервер на одной машине, чтобы оценить производительность TCP и UDP, устранив влияние сети. В обоих случаях сегменты TCP или датаграммы UDP инкапсулируются в IP-датаграммах и посылаются возвратному интерфейсу 1оО, который немедленно переправляет их процедуре обработки IP-входа, как показано на рис. 2.17.


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





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