gethostbyaddr-Makro (wsipv6ok.h)
[gethostbyaddr wird ab Windows Sockets 2 nicht mehr empfohlen. Verwenden Sie stattdessen getnameinfo.]
Die gethostbyaddr-Funktion ruft die Hostinformationen ab, die einer Netzwerkadresse entsprechen.
Syntax
void gethostbyaddr(
[in] a,
[in] b,
[in] c
);
Parameter
[in] a
Ein Zeiger auf eine Adresse in Netzwerkbytereihenfolge.
[in] b
Die Länge der Adresse in Bytes.
[in] c
Der Typ der Adresse, z. B. der AF_INET Adressfamilientyp (verwendet mit TCP, UDP und anderen zugeordneten Internetprotokollen). Mögliche Werte für die Adressfamilie sind in der Headerdatei Winsock2.h definiert.
Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die organization der Headerdateien geändert, und die möglichen Werte für die Adressfamilie sind in der Headerdatei Ws2def.h definiert. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und nie direkt verwendet werden sollte.
Beachten Sie, dass die Werte für die AF_ Adressfamilie und PF_ Protokollfamilienkonstanten identisch sind (z. B. AF_INET und PF_INET), sodass beide Konstanten verwendet werden können.
In der folgenden Tabelle sind die möglichen Werte für die Adressfamilie aufgeführt, die unterstützt werden.
Rückgabewert
Keine
Bemerkungen
Die gethostbyaddr-Funktion gibt einen Zeiger auf die Hostent-Struktur zurück, der den Namen und die Adresse enthält, die der angegebenen Netzwerkadresse entsprechen.
Der Arbeitsspeicher für die hostent-Struktur , die von der gethostbyaddr-Funktion zurückgegeben wird, wird intern von der Winsock-DLL aus lokalem Threadspeicher zugeordnet. Es wird nur eine einzelne Hostentstruktur zugeordnet und verwendet, unabhängig davon, wie oft die Funktionen gethostbyaddr oder gethostbyname im Thread aufgerufen werden. Die zurückgegebene Hostentstruktur muss in einen Anwendungspuffer kopiert werden, wenn zusätzliche Aufrufe für die Funktionen gethostbyaddr oder gethostbyname im selben Thread ausgeführt werden sollen. Andernfalls wird der Rückgabewert durch nachfolgende aufrufe gethostbyaddr oder gethostbyname im selben Thread überschrieben. Der für die zurückgegebene Hostentstruktur zugewiesene interne Arbeitsspeicher wird von der Winsock-DLL freigegeben, wenn der Thread beendet wird.
Eine Anwendung sollte nicht versuchen, den von der zurückgegebenen Hostentstruktur verwendeten Arbeitsspeicher freizugeben. Die Anwendung darf niemals versuchen, diese Struktur zu ändern oder ihre Komponenten frei zu geben. Darüber hinaus wird nur eine Kopie dieser Struktur pro Thread zugewiesen, sodass die Anwendung alle benötigten Informationen kopieren sollte, bevor sie andere Funktionsaufrufe für gethostbyaddr oder gethostbyname ausgibt.
Obwohl gethostbyaddr nicht mehr für die Verwendung ab Windows Sockets 2 empfohlen wird und die getnameinfo-Funktion verwendet werden sollte, ist gethostbyaddr in der Lage, einen NetBIOS-Namen zurückzugeben. getnameinfo ist nicht. Entwickler, die eine NetBIOS-Namensauflösung benötigen, müssen möglicherweise gethostbyaddr verwenden, bis ihre Anwendungen völlig unabhängig von NetBIOS-Namen sind.
Beispielcode
Im folgenden Beispiel wird die Verwendung der Funktion gethostbyaddr veranschaulicht.#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
int main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
DWORD dwError;
int i = 0;
int bIpv6 = 0;
struct hostent *remoteHost;
char *host_addr;
struct in_addr addr = { 0 };
IN6_ADDR addr6;
char **pAlias;
// Validate the parameters
if (argc < 2) {
printf("usage: %s 4 ipv4address\n", argv[0]);
printf(" or\n");
printf("usage: %s 6 ipv6address\n", argv[0]);
printf(" to return the hostname\n");
printf(" %s 4 127.0.0.1\n", argv[0]);
printf(" %s 6 0::1\n", argv[0]);
return 1;
}
// Validate parameters
if (atoi(argv[1]) == 4)
bIpv6 = 0;
else if (atoi(argv[1]) == 6)
bIpv6 = 1;
else {
printf("usage: %s 4 ipv4address\n", argv[0]);
printf(" or\n");
printf("usage: %s 6 ipv6address\n", argv[0]);
printf(" to return the hostname\n");
printf(" %s 4 127.0.0.1\n", argv[0]);
printf(" %s 6 0::1\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_addr = argv[2];
printf("Calling gethostbyaddr with %s\n", host_addr);
if (bIpv6 == 1) {
{
iResult = inet_pton(AF_INET6, host_addr, &addr6);
if (iResult == 0) {
printf("The IPv6 address entered must be a legal address\n");
return 1;
} else
remoteHost = gethostbyaddr((char *) &addr6, 16, AF_INET6);
}
} else {
addr.s_addr = inet_addr(host_addr);
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 Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | wsipv6ok.h (einschließlich Winsock2.h, Winsock.h) |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |