Протокол Finger и информация о пользователях, страница 7

#define IPPORT_SYSTAT       11

#define IPPORT_DAYTIME      13

#define IPPORT_NETSTAT      15

#define IPPORT_FTP          21

#define IPPORT_TELNET       23

#define IPPORT_SMTP         25

#define IPPORT_TIMESERVER   37

#define IPPORT_NAMESERVER   42

#define IPPORT_WHOIS        43

#define IPPORT_MTP          57

ttdefine IPPORT_TFTP         69

#define IPPORT_RJE          77

#define IPPORT_FINGER       79

#define ipport_ttylink      87

#define IPPORT_SUPDUP       95

Другими словами, Q Finger пытается получить номер порта Finger из базы данных при помощи getservbyname. Если это ему не удается и lpServEnt равен NULL, программа использует номер порта Finger по умолчанию, как он определен в winsock.h:

lpServEnt = getservbyname("Finger", NULL);

if (lpServEnt == NULL)

iFingerPort = IPPORT_FINGER; // Используем официальный

// номер порта

else              iFingerPort =lpServEnt->s_port;

To есть успешная работа функции getservbyname для QFinger не очень важна. С другой стороны, для некоторых сетевых служб winsock.h не содержит никакой информации. Например, в winsock.h не определен протокол передачи новостей NNTP (Network News Transfer Protocol). Иногда вы можете не знать, каким транспортным протоколом пользуется та или иная сетевая служба. В обоих случаях вы обязаны запросить информацию из базы данных, и если ее там не окажется, программу придется прервать.

Структура адреса сокета

Переменная sockAddr типа SOCKADDR_IN объявлена следующим образом:

SOCKADDR_IN sockAddr;    // Структура адреса сокета

Тип SOCKADDR_IN объявляется в winsock.h как структура адреса сокета:

typedef struct sockaddr_in SOCKADDR_IN; // Расширенный тип Windows

struct sockaddr_in

{

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

Таблица 3. Элементы структуры адреса сокета

Элемент

Назначение

sin_family sin_port sin_addr

sin_zero

Тип адреса сокета. В случае TCP/IP всегда равен AFINET. Номер порта протокола.

IP-адрес удаленного компьютера, записанный в структуре inaddr Winsock.

В настоящее время не используется и равен нулю.

Адресная структура sockaddr_in содержит информацию об адресе в формате Windows Sockets. Адрес компьютера необходим всегда, когда вы обращаетесь к удаленному компьютеру. Он должен быть доступен всем программам Windows Sockets API, поскольку требуется при соединении сокета. IP-адрес Winsock содержится в элементе sin_addr адресной структуры сокета.

Что такое семейства адресов и протоколов?

Элемент sin_family адресной структуры определяет тип адреса для сокета. Как указано в табл. 3, семейство адресов для TCP/IP всегда AF_INET. Сетевые протоколы могут использовать другое представление адресов. Концепция семейства адресов и протоколов позволяет программам просто манипулировать адресами, не вдаваясь в подробности реализации. Например, вы можете написать процедуру, которая выполняет различные действия, в зависимости от того, с каким семейством адресов имеет дело.

Другими словами, как и в случае интерфейса Беркли, разработчики Winsock могут приспособить его для работы не только с сетевыми протоколами TCP/IP. Поскольку в качестве параметров функций могут задаваться различные семейства адресов и протоколов, можно с легкостью переходить от одного набора сетевых протоколов к другому. Иногда, чтобы перейти к другому типу сети, программисту достаточно заменить только значения констант.

Функция gethostbyaddr — хороший образец процедуры, предназначенной для работы с различными семействами адресов или протоколов.

Первый параметр gethostbyaddr должен указывать на действительный IP-адрес. Адрес должен быть в двоичном виде (и с сетевым порядком байтов). Обратите внимание на то, что IP-адрес 32-разрядный, а первым параметром gethostbyaddr является указатель на тип char.