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

#define SEND_FLAGS 0            // Флаги для функции send()

//не заданы

#define RECV_FLAGS 0            // Флаги для функции recv()

//не заданы

Константы PROG_NAME, HOST_NAME и WINSOCK_VERSION здесь играют ту же роль, что и в QLookup. HOST_NAME должна являться именем реально существующего в Интернет компьютера. В качестве имени пользователя QFinger передает серверу константу FINGER_QUERY.

В нашем случае HOST_NAME задает имя компьютера «cerfnet.com». Константа FINGER_QUERY задает пользователя по имени «lonetech». Вместо этих значений или идентификатора пользователя можно подставить любые другие — лишь бы они существовали в реальности. Константа DEFAULT_PROTOCOL, равная нулю, говорит о том, что нам нужен стандартный протокол Finger, то есть протокол по умолчанию.

Переменные

• В следующих строках исходного текста объявляются некоторые переменные и описывается функция WinMain:

int PASCAL WinMain(HANDLE hinstance, HANDLE hPrevInstance,

LPSTR IpszCmdParam, int nCmdShow)

{

WSADATA wsaData;           // Сведения о реализации Winsock

LPHOSTENT lpHostEnt;      // Структура с информацией о

// сетевом компьютере

SOCKET nSocket;           // Номер сокета, используемого

//в данной программе

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

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

short iFingerPort;        // Официальный номер порта протокола — 79

char szFingerInfo[5000]; // Буфер для хранения информации Finger

char szFingerQuery[100]; // Буфер для хранения запроса Finger

int nCharSent;            // Количество переданных символов

int nCharRecv;            // Количество принятых символов

int nConnect;             // Результат соединения сокета

Переменная wsaData, так же, как и в QLookup, содержит сведения о реализации Winsock, полученные при вызове WSAStartup. lpHostEnt также указывает на структуру данных с информацией об удаленном компьютере. Структура заполняется при вызове функции gethostbyname.

Переменная nSocket имеет тип SOCKET, определенный в winsock.h как беззнаковое целое. Назначение переменной типа SOCKET соответствует назначению дескриптора файла. Программа Winsock может создавать множество сокетов, подобно тому, как программа DOS или Windows может одновременно открывать множество файлов. Переменная типа SOCKET указывает на сокет, созданный нашей программой для обмена данными с сервером. В переменной iFingerPort хранится номер порта службы Finger. Переменная szFingerInfo является вместилищем данных, полученных от удаленного компьютера.

Переменная szFingerQuery служит буфером запроса к службе Finger. Переменные целого типа, nCharSent и nCharRecv подсчитывают количество байтов, переданное или полученное через сокет нашей программой.

В переменной nConnect хранится результат операции по соединению сокета. QFinger проверяет ее значение, чтобы выяснить, было ли соединение успешным.

С самого начала

Несколько первых операторов в QFINGER.CPP в точности повторяют операторы из Qlookup:

if (WSAStartup(WINSOCK_VERSION, &wsaData))

MessageBox(NULL, "Could not load Windows Sockets DLL.", PROG_NAME, MB_OK | MB_ICONSTOP) ;

else   // Преобразуем имя сетевого компьютера

{

lpHostEnt = gethostbyname(HOST_NAME);

if (!lpHostEnt)

MessageBox(NULL, "Could not get IP address!", HOST_NAME,

MB_OK | MB_ICONSTOP) ;

    else

   {            // Продолжаем выполнение QFinger

}

}

WSACleanup(); // Программа освобождает занятые ресурсы и

// завершается

return NULL;