В начале, как видим, вызывается 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 ;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.