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

В начале, как видим, вызывается WSAStartup. Ее задача — инициализировать модуль WINSOCK.DLL. Далее вызывается gethostbyname, чтобы получить из DNS информацию о сетевом компьютере, который нас интересует. Параметр gethostbyname — имя компьютера, а результатом при успешном выполнении является указатель на структуру (lpHostEnt), содержащую данные о компьютере. Если возвращаемый указатель равен NULL (запрос был неудачным), программа выведет соответствующее сообщение на дисплей. Поскольку остальные операторы программы заключены в фигурные скобки ({}) конструкции else, следующим после неудачного выполнения gethostbyname будет оператор WSACleanup, и программа корректно завершится. Вы помните, что WSACleanup освобождает ресурсы Winsock, связанные с вызывающей программой. WSACleanup должен вызываться всегда перед завершением программы.

Создание сокета

Если переменная-указатель lpHostEnt не равна NULL, QFinger вызывает функцию socket и создает новый сокет для сетевого соединения:

if (!lpHostEnt)

MessageBox(NULL, "Could not get IP address!", HOST_NAME, MB_OK|MB_ICONSTOP) ;

else    // Создаем сокет

{

nSocket = socket(PF_INET, SOCK_STREAM, DEFAULTJPROTOCOL);

if (nSocket == INVALID_SOCKET)

MessageBox(NULL, "Invalid socket!!", PROG_NAME, MB_OK|MB_ICONSTOP) ;

Функция socket возвращает дескриптор сокета. Дескриптор, как мы уже писали, хранится в переменной nSocket типа SOCKET. Следующий оператор проверяет, действительно ли сокет существует, сравнивая значение дескриптора с константой INVALID_SOCKET. Если нет, то есть свободных сокетов не существует, на дисплей выводится предупреждающее сообщение, и программа завершается. У функции socket следующий прототип:

SOCKET PASCAL PAR socket (int af, int type, int protocol);

При вызове указываются три параметра. Первый — семейство адресов. В версии 1.1 Winsock существует только одно семейство адресов и протоколов, AF_INET и PF_INET соответственно. Второй параметр обозначает тип сетевой службы (потоковый или датаграммный) для использования вместе с сокетом. Winsock версии 1.1 обеспечивает два этих типа сетевых служб; они обозначаются константами SOC_STREAM и SOCK_DGRAM соответственно.

Сетевая служба SOCK_STREAM обеспечивает надежную, двухстороннюю, ориентированную на соединение передачу данных. Транспортный протокол для этой службы — TCP. Служба SOCK_DGRAM, наоборот, ненадежна, поскольку использует датаграммы и ориентирована на протокол UDP. Если вы не хотите определять протокол, четвертый параметр функции socket равен нулю. При этом используется стандартный протокол или протокол по умолчанию. В случае QFinger четвертый параметр функции, DEFAULT_PROTOCOL, как раз и равен нулю.

После того как сокет создан и программа получила его дескриптор, он настраивается на адрес удаленного компьютера. Первый шаг на этом пути — получение информации о сетевой службе из базы данных. В случае QFinger необходима информация о сетевой службе Finger.

Что такое база данных по сетевым службам?

В базе данных по сетевым службам хранится информация о службах типа Finger, Ftp, Mail, Telnet и многих других. Для каждой службы задается номер порта, доступные протоколы и псевдонимы (другие имена для той же самой службы). На персональных компьютерах эта информация, как правило, находится в текстовом файле формата ASCII под названием SERVICES. Файл SERVICES обычно находится в том же каталоге, что и WINSOCK.DLL. Переменная lpServEnt программы QFinger указывает на структуру с информацией о сетевой службе:

LPSERVENT lpServEnt;      // Структура с информацией о сетевой службе

Структура LPSERVENT определена в файле-заголовке winsock.h следующим образом:

typedef struct servent FAR *LPSERVENT; // Расширенный тип данных Windows

struct servent

{

char FAR * s_name;

char FAR * FAR * s_aliases;

short s_port ;