Estrutura HOSTENT (winsock.h)
A estrutura do hostent é usada por funções para armazenar informações sobre um determinado host, como nome do host, endereço IPv4 e assim por diante. Um aplicativo nunca deve tentar modificar essa estrutura ou liberar nenhum de seus componentes. Além disso, apenas uma cópia da estrutura de hostent é alocada por thread e, portanto, um aplicativo deve copiar todas as informações necessárias antes de emitir qualquer outra chamada à API do Windows Sockets.
Sintaxe
typedef struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;
Membros
h_name
O nome oficial do host (PC). Se estiver usando o DNS ou um sistema de resolução semelhante, será o FQDN (Nome de Domínio Totalmente Qualificado) que fez com que o servidor retornasse uma resposta. Se estiver usando um arquivo de hosts local, ele será a primeira entrada após o endereço IPv4.
h_aliases
Uma matriz terminada em NULL de nomes alternativos.
h_addrtype
O tipo de endereço que está sendo retornado.
h_length
O comprimento, em bytes, de cada endereço.
h_addr_list
Uma lista terminada em NULL de endereços para o host. Os endereços são retornados na ordem de bytes de rede. A macro h_addr é definida como para h_addr_list[0]
compatibilidade com software mais antigo.
Comentários
As funções gethostbyaddr e gethostbyname retornam um ponteiro para uma estrutura de hostent , uma estrutura alocada pelo Windows Sockets. A estrutura do hostent contém os resultados de uma pesquisa bem-sucedida para o host especificado no parâmetro name .
A memória para a estrutura de host retornada pelas funções gethostbyaddr e gethostbyname é alocada internamente pela DLL winsock do armazenamento local do thread. Somente uma única estrutura de hostent é alocada e usada, independentemente de quantas vezes as funções gethostbyaddr ou gethostbyname são chamadas no thread. A estrutura de hostent retornada deverá ser copiada para um buffer de aplicativo se chamadas adicionais forem feitas para as funções gethostbyaddr ou gethostbyname no mesmo thread. Caso contrário, o valor retornado será substituído por chamadas gethostbyaddr ou gethostbyname subsequentes no mesmo thread. A memória interna alocada para a estrutura de host retornada é liberada pela DLL do Winsock quando o thread é encerrado.
Um aplicativo não deve tentar liberar a memória usada pela estrutura de host retornada . O aplicativo nunca deve tentar modificar essa estrutura ou liberar nenhum de seus componentes. Além disso, apenas uma cópia dessa estrutura é alocada por thread, portanto, o aplicativo deve copiar todas as informações necessárias antes de emitir qualquer outra chamada de função para gethostbyaddr ou gethostbyname.
Exemplos
Os exemplos a seguir demonstram o uso da estrutura de hostent com a função 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;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 2000 Professional [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows 2000 Server [somente aplicativos da área de trabalho] |
Cabeçalho | winsock.h (inclua Winsock2.h) |