gethostbyaddr-Funktion (winsock.h)
[gethostbyaddr wird ab Windows Sockets 2 nicht mehr für die Verwendung empfohlen. Verwenden Sie stattdessen getnameinfo.]
Die gethostbyaddr-Funktion ruft die Hostinformationen ab, die einer Netzwerkadresse entsprechen.
Syntax
hostent * gethostbyaddr(
const char *addr,
int len,
int type
);
Parameter
addr
TBD
len
TBD
type
TBD
Rückgabewert
Wenn kein Fehler auftritt, gibt gethostbyaddr einen Zeiger auf die hostent-Struktur zurück. Andernfalls wird ein NULL-Zeiger zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Ein ungültiges Argument wurde angegeben. Dieser Fehler wird zurückgegeben, wenn AF_INET6 im Typparameter angegeben wurde und der Parameter len nicht auf die Größe einer IPv6-Adresse festgelegt wurde. | |
Fehler beim Netzwerksubsystem. | |
Autorisierender Antworthost nicht gefunden. | |
Nicht autoritativer Host nicht gefunden, oder Serverfehler. | |
Ein nicht behebbarer Fehler ist aufgetreten. | |
Gültiger Name, kein Datensatz des angeforderten Typs. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
Der angegebene Typ wird von der Windows Sockets-Implementierung nicht unterstützt. | |
Der addr-Parameter ist kein gültiger Teil des Benutzeradressraums, oder der Parameter len ist zu klein. | |
Ein blockierender Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen. |
Hinweise
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 dem lokalen Threadspeicher zugeordnet. Es wird nur eine einzelne hostent-Struktur zugeordnet und verwendet, unabhängig davon, wie oft die Funktionen gethostbyaddr oder gethostbyname im Thread aufgerufen werden. Die zurückgegebene hostent-Struktur muss in einen Anwendungspuffer kopiert werden, wenn zusätzliche Aufrufe an die Funktionen gethostbyaddr oder gethostbyname im selben Thread erfolgen sollen. Andernfalls wird der Rückgabewert von nachfolgenden gethostbyaddr - oder gethostbyname-Aufrufen im selben Thread überschrieben. Der für die zurückgegebene Hostent-Struktur zugeordnete interne Speicher wird von der Winsock-DLL freigegeben, wenn der Thread beendet wird.
Eine Anwendung sollte nicht versuchen, den von der zurückgegebenen Hostent-Struktur verwendeten Arbeitsspeicher freizugeben. Die Anwendung darf niemals versuchen, diese Struktur zu ändern oder ihre Komponenten frei zu geben. Darüber hinaus wird pro Thread nur eine Kopie dieser Struktur zugeordnet, sodass die Anwendung alle benötigten Informationen kopieren sollte, bevor sie andere Funktionsaufrufe für gethostbyaddr oder gethostbyname ausgibt.
Obwohl gethostbyaddr ab Windows Sockets 2 nicht mehr für die Verwendung empfohlen wird und die getnameinfo-Funktion verwendet werden sollte, kann gethostbyaddr einen NetBIOS-Namen zurückgeben. getnameinfo ist nicht. Entwickler, die die NetBIOS-Namensauflösung benötigen, müssen möglicherweise gethostbyaddr verwenden, bis ihre Anwendungen vollständig unabhängig von NetBIOS-Namen sind.
Beispielcode
Im folgenden Beispiel wird die Verwendung der gethostbyaddr-Funktion 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 ab Windows Phone 8 unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Anforderung | Wert |
---|---|
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 | winsock.h (einschließlich Winsock2.h, Winsock.h) |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |