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