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


         

Обнулив структуру sockaddr_in, записываем


12     if (!inet_aton (hname, &sap->sin_addr))

13     {

14      hp = gethostbyname(hname);

15      if ( hp == NULL )

16       error( 1, 0, "неизвестный хост: %s\n", hname );

17      sap->sin_addr = *( struct in_addr * )hp->h_addr;

18     }

19   }

20   else

21     sap->sin_addr.s_addr = htonl( INADDR_ANY );

22   port = strtol( sname, &endptr, 0 );

23   if ( *endptr == '\0' )

24     sap->sin_port = htons( port );

25   else

26   {

27     sp = getservbyname( sname, protocol );

28     if ( sp == NULL )

29      error( 1, 0, "неизвестный сервис: %s\n", sname );

30     sap->sin_port = sp->s_port;

31   }

32   }

set_address

8- 9 Обнулив структуру sockaddr_in, записываем в поле адресного семейства AF_INET.

10-19 Если hname не NULL, то предполагаем, что это числовой адрес в стандартной десятичной нотации. Преобразовываем его с помощью функции inet_aton, если inet_aton возвращает код ошибки, - пытаемся преобразовать hname в адрес с помощью gethostbyname. Если и это не получается, то печатаем диагностическое сообщение и завершаем программу.

20-21 Если вызывающая программа не указала ни имени, ни адреса хоста, устанавливаем адрес INADDR_ANY.

22-24 Преобразовываем sname в целое число. Если это удалось, то записываем номер порта в сетевом порядке (совет 28).

27-30 В противном случае предполагаем, что это символическое название ервиса и вызываем getservbyname для получения соответствующего номера порта. Если сервис неизвестен, печатаем диагностическое сообщение и завершаем программу. Заметьте, что getservbyname уже возвращает номер порта в сетевом порядке.

Поскольку иногда приходится вызывать функцию set_address напрямую, лесь приводится ее прототип:

#include "etcp.h"

void set_address(char *host, char *port,

 struct sockaddr_in *sap, char *protocol);

Последняя функция - error - показана в листинге 2.4. Это стандартная диагностическая процедура.

#include "etcp.h"

void error(int status, int err, char *format,...);


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





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