Теория и практика программирования на Си в Unix

- Построение сетевых адресов


Для конструирования адреса Internet по имени машины,можно ис- пользовать функцию gethostbyname (). #include <netdb.h>
struct hostent *gethostbyname (hostname) char *hostname
Функция возвращает указатель структуры hostent:
struct hostent {
char *h_name; /*имя машины*/
char **h_aliases; /*список псевдоимен*/
int h_addrtype; /*AF_INET*/
int h_length; /*4 байта*/
char **h_addr_list;
/*список адресов Internet*/
};
Эта функция находит адрес в файле /etc/hosts, или же использует сервисные программы сервера имен. Сервером имен является демон (следящая программа) UNIX, который обладает или может найти имя и адрес всех машин сети. Наиболее распространенными серверами имен являются NIS (Network Information Service), который ранее назывался YP (Yellow Pages) и BIND (Berkeley Internet Name Service), иначе называемый DNS (Domain Name Service).

ПРОГРАММА 23 /* программа, выдающая на экран адреса Internet, соответст-

вующие именам машин, указанных в качестве параметра */ #include "soct.h" #include <arpa/inet.h>

main(argc, argv) int argc; char **argv; { struct hostent *hostp; /* структура адреса */ long int i; /* счетчик цикла */

/* цикл по аргументам = именам машин */ for (i = 1; i<argc; i++) { if ( (hostp = (structhostent *) gethostbyname(argv[i])) == NULL) printf("**host %s non trouve**\n", argv[i]); else { /* считается, что у машины только один адрес Internet */ printf("host %s adresse : %s \n", hostp->h_name, inet_ntoa(*hostp->h_addr_list)); } } }

Одна из функций позволяет найти имя машины по ее адресу Internet: gethostbyaddr (). Наконец, один из примитивов позволяет найти номер порта сервисной программы, определенной в файле /etc/services: getservbyname ().
#include <netdb.h>
struct servent *getservbyname (servname, protoname) char *servname; /*имя услуги*/
char *protoname; /*TCP или UDP*/
Функция возвращает указатель на структуру servent:
struct servent {
char *s_name; /*имя услуги*/
char **s_aliases; /*список псевдоимен*/
int s_port; /*номер порта*/
char *s_proto; /*используемый протокол*/
};

ПРОГРАММА 24 /* программа, выдающая на экран номера портов, соответствующих именам служб, указанных в качестве параметра */ #include "soct.h" #include <arpa/inet.h>


main(argc, argv) int argc; char **argv; { struct servent *servp; /* структура службы */ long int i; /* счетчик цикла */ /* цикл по аргументам = именам служб */ for (i = 1; i<argc; i++) { if ( (servp = getservbyname(argv[i], "tcp")) == NULL) && (servp = getservbyname(argv[i], "udp")) == NULL) printf("**service %s non trouve**\n", argv[i]); else { /* обратите внимание на номер порта : значение считывается в формате сети ; используйте htonl() */ printf("service %s port: %d protocole: %s \n", servp->s_name, htonl(servp->s_port), servp->s_proto); } } }

- Адрес, связанный с сокетом
int getsockname (sock, адрес, addrlen) int sock; /*сокет-дескриптор*/
struct sockaddr *адрес; /*указатель адреса*/
int *addrlen; /*длина адреса*/

Этот примитив позволяет найти адрес порта, присвоенный сис- темой.




Содержание раздела