Структура HOSTENT (winsock.h)
Структура узла используется функциями для хранения сведений об определенном узле, таких как имя узла, IPv4-адрес и т. д. Приложение никогда не должно пытаться изменить эту структуру или освободить какие-либо из ее компонентов. Кроме того, для каждого потока выделяется только одна копия структуры размещения , поэтому приложение должно копировать все необходимые сведения перед выполнением других вызовов API сокетов Windows.
Синтаксис
typedef struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;
Члены
h_name
Официальное имя узла (ПК). При использовании DNS или аналогичной системы разрешения именно полное доменное имя (FQDN) заставило сервер вернуть ответ. При использовании локального файла hosts это первая запись после IPv4-адреса.
h_aliases
Массив альтернативных имен, заканчивающийся значением NULL.
h_addrtype
Тип возвращаемого адреса.
h_length
Длина каждого адреса в байтах.
h_addr_list
Список адресов узла, завершающийся значением NULL. Адреса возвращаются в порядке байтов сети.
Макрос h_addr определен для h_addr_list[0]
совместимости со старым программным обеспечением.
Комментарии
Функции gethostbyaddr и gethostbyname возвращают указатель на структуру узла — структуру, выделенную windows Sockets. Структура узла содержит результаты успешного поиска узла, указанного в параметре name .
Память для структуры узла , возвращаемая функциями gethostbyaddr и gethostbyname , выделяется внутренне библиотекой DLL Winsock из локального хранилища потока. Выделяется и используется только одна структура узла , независимо от того, сколько раз функции gethostbyaddr или gethostbyname вызываются в потоке. Возвращаемая структура узла должна быть скопирована в буфер приложения, если требуется выполнить дополнительные вызовы функций gethostbyaddr или gethostbyname в том же потоке. В противном случае возвращаемое значение будет перезаписано последующими вызовами gethostbyaddr или gethostbyname в том же потоке. Внутренняя память, выделенная для возвращаемой структуры узла , освобождается библиотекой DLL Winsock при выходе потока.
Приложение не должно пытаться освободить память, используемую возвращаемой структурой размещения . Приложение никогда не должно пытаться изменить эту структуру или освободить какие-либо из ее компонентов. Кроме того, для каждого потока выделяется только одна копия этой структуры, поэтому приложение должно скопировать все необходимые сведения перед выполнением других вызовов функций gethostbyaddr или gethostbyname.
Примеры
В следующих примерах показано использование структуры узла с функцией gethostbyname .
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
DWORD dwError;
int i = 0;
struct hostent *remoteHost;
char *host_name;
struct in_addr addr;
char **pAlias;
// Validate the parameters
if (argc != 2) {
printf("usage: %s ipv4address\n", argv[0]);
printf(" or\n");
printf(" %s hostname\n", argv[0]);
printf(" to return the host\n");
printf(" %s 127.0.0.1\n", argv[0]);
printf(" to return the IP addresses for a host\n");
printf(" %s www.contoso.com\n", argv[0]);
return 1;
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
host_name = argv[1];
// If the user input is an alpha name for the host, use gethostbyname()
// If not, get host by addr (assume IPv4)
if (isalpha(host_name[0])) { /* host address is a name */
printf("Calling gethostbyname with %s\n", host_name);
remoteHost = gethostbyname(host_name);
} else {
printf("Calling gethostbyaddr with %s\n", host_name);
addr.s_addr = inet_addr(host_name);
if (addr.s_addr == INADDR_NONE) {
printf("The IPv4 address entered must be a legal address\n");
return 1;
} else
remoteHost = gethostbyaddr((char *) &addr, 4, AF_INET);
}
if (remoteHost == NULL) {
dwError = WSAGetLastError();
if (dwError != 0) {
if (dwError == WSAHOST_NOT_FOUND) {
printf("Host not found\n");
return 1;
} else if (dwError == WSANO_DATA) {
printf("No data record found\n");
return 1;
} else {
printf("Function failed with error: %ld\n", dwError);
return 1;
}
}
} else {
printf("Function returned:\n");
printf("\tOfficial name: %s\n", remoteHost->h_name);
for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
printf("\tAlternate name #%d: %s\n", ++i, *pAlias);
}
printf("\tAddress type: ");
switch (remoteHost->h_addrtype) {
case AF_INET:
printf("AF_INET\n");
break;
case AF_INET6:
printf("AF_INET6\n");
break;
case AF_NETBIOS:
printf("AF_NETBIOS\n");
break;
default:
printf(" %d\n", remoteHost->h_addrtype);
break;
}
printf("\tAddress length: %d\n", remoteHost->h_length);
if (remoteHost->h_addrtype == AF_INET) {
while (remoteHost->h_addr_list[i] != 0) {
addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
printf("\tIPv4 Address #%d: %s\n", i, inet_ntoa(addr));
}
} else if (remoteHost->h_addrtype == AF_INET6)
printf("\tRemotehost is an IPv6 address\n");
}
return 0;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Верхняя часть | winsock.h (включая Winsock2.h) |