![]() |
|
|
Benötigen Sie hingegen von einer IP-Adresse Informationen zu einem Rechner, können Sie die Funktion gethostbyaddr() verwenden. Diese Funktion gibt bei Erfolg ebenfalls einen Zeiger auf die Struktur hostent des gefundenen Rechners zurück oder bei einem Fehler NULL.
#include <netdb.h> struct hostent *gethostbyaddr( const char *ip_addr, int len, int type ); Mit dem ersten Parameter geben Sie die IP-Adresse des Zielrechners an. Mit dem zweiten wird die Länge dieser Adresse angegeben, und der letzte Parameter gibt den Typ der Adresse an, der auch hier meistens AF_INET für IPv4 bzw. AF_INET6 für IPv6 ist. Beachten Sie bitte, dass beide Funktionen (gethostbyname() und gethostbyaddr()) nur einen statischen Speicherbereich für den Rückgabewert reservieren. Jeder nachfolgende Funktionsaufruf überschreibt diesen Speicherplatz wieder. GNU bietet auch gethostbyname_r() und gethostbyaddr_r() für Thread-safe-Aktionen an.
Wenn ein Fehler auf der Suche nach einem Rechner mit den Funktionen gethostbyaddr() und gethostbyname() auftritt, sollten Sie die Funktion herror() aufrufen, die ähnlich wie perror() ist, um eine sinnvolle Fehlermeldung zu erhalten, warum ein Fehler aufgetreten ist. Die herror()-Funktion gibt die zum aktuellen Wert von h_errno gehörende Fehlermeldung auf stderr aus. #include <netdb.h> extern int h_errno; void herror ( const char *string ); Die Variable h_errno kann folgende Werte annehmen:
Falls also auf Ihrem System keine Funktion wie herror() vorhanden ist, können Sie mit den Fehlercodes von h_error ohne Probleme eine eigene Fehlerausgaberoutine nachimplementieren. Das folgende Beispiel soll demonstrieren, wie Sie Informationen zu einem Rechner durch Angabe eines Rechnernamens oder einer IP-Adresse aus der Struktur hostent herausfinden können. /* hostent.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main(int argc, char **argv) {
struct hostent *host;
struct in_addr ip, **ip_ptr;
char **ptr;
if( argc != 2 )
printf("Usage: %s (Rechnername oder IP-Adresse)\n",
*argv);
else {
/* Argument als IP-Adresse ...? */
if( inet_aton( argv[1], &ip ) != 0 )
host=gethostbyaddr( (const void *)&ip,
sizeof(ip),AF_INET );
/* Argument als Rechnername */
else
host = gethostbyname( argv[1] );
if( host == NULL ) {
herror("Konnte Rechner nicht finden");
return EXIT_FAILURE;
}
printf("Hostname : %s\n", host->h_name);
printf("Aliase :\n");
ptr=host->h_aliases;
while( *ptr != NULL ) {
printf("\t%s\n", *ptr++);
}
printf("IP-Adressen :\n");
ip_ptr = (struct in_addr **)host->h_addr_list;
while(*ip_ptr != NULL) {
printf("\t%s\n", inet_ntoa( **ip_ptr++));
}
}
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung: $ gcc -o hostent hostent.c $ ./hostent google.de Hostname : google.de Aliase : IP-Adressen : 216.239.33.100 216.239.37.100 216.239.39.100 $ ./hostent www.pronix.de Hostname : www.pronix.de Aliase : IP-Adressen : 194.150.178.34 $ ./hostent 194.150.178.34 Hostname : goliath.speedpartner.de Aliase : IP-Adressen : 194.150.178.34 $ ./hostent www.microsoft.com Hostname : www.microsoft.com.nsatc.net Aliase : www.microsoft.com IP-Adressen : 207.46.19.30
11.10.3 Service-Informationen – getservbyname() und getservbyport()
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Strukturvariable | Bedeutung |
| s_name | Offizieller Servicename |
| s_aliases | Ein Stringarray mit eventuellen Aliasnamen zum Service, falls vorhanden. Das letzte Element in der Liste ist NULL. |
| s_port | Die Portnummer zum Servicenamen |
| s_proto | Der Name des verwendeten Protokolls |
Hier die Syntax zu getservbyname():
#include <netdb.h> struct servent *getservbyname ( const char *name, const char *proto );
Bei Angaben des Dienstes name und des Protokolls proto liefert Ihnen diese Funktion bei Erfolg eine Adresse auf die Information in struct servent. Bei einem Fehler wird NULL zurückgegeben.
Ähnlich verhält es sich mit der Funktion getservbyport() (im Vergleich mit getservbyname()). Nur liefert getservbyport() zum Dienst mit der Portnummer port (network-byte-order) und dem Protokoll proto die struct servent-Informationen zurück.
#include <netdb.h> struct servent *getservbyport(int port, const char *proto);
Hierzu ein Beispiel, das die Funktion getservbyname() demonstriert. Da meistens Informationen abgefragt werden, die das TCP-Protokoll betreffen, könnten Sie auch das zweite Argument der Funktion getserbyname() gleich mit der Stringkonstante "tcp" belegen.
/* servent.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
int main (int argc, char **argv) {
struct servent *service_info;
char **ptr;
if( argc != 3) {
printf("Usage: %s dienst protokoll\n", *argv);
return EXIT_FAILURE;
}
service_info = getservbyname( argv[1], argv[2] );
if( service_info == NULL ) {
herror("Konnte den Service nicht finden\n");
return EXIT_FAILURE;
}
printf("Service : %s\n", service_info->s_name);
printf("Port : %d\n", ntohs( service_info->s_port) );
printf("Aliase : \n");
ptr = service_info->s_aliases;
while(*ptr != NULL) {
printf("%s\n", *ptr++);
}
printf("Protokoll : %s\n", service_info->s_proto);
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc -o servent servent.c $ ./servent http tcp Service : http Port : 80 Aliase : (null) Protokoll : tcp $ ./servent ftp tcp Service : ftp Port : 21 Aliase : (null) Protokoll : tcp $ ./servent pop3 tcp Service : pop3 Port : 110 Aliase : (null) Protokoll : tcp
Dasselbe Beispiel auch mit der Funktion getservbyport(). Als Protokoll verwenden Sie hierbei gewöhnlich TCP. Beim Beispiel werden entsprechende Informationen von den Ports 1 bis 100 (ohne den Alias) ausgegeben:
/* servent2.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main (int argc, char **argv) {
struct servent *service_info;
int port = 0;
while (port++ < 100) {
service_info = getservbyport (htons (port), "tcp");
if (service_info == NULL)
printf ("Port %d : Keine Infos\n", port);
else {
printf ("Service : %10s ", service_info->s_name);
printf ("Port : %3d ",
ntohs (service_info->s_port));
printf ("Protokoll : %5s\n", service_info->s_proto);
}
}
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc -o servent2 servent2.c $ ./servent2 Service : tcpmux Port : 1 Protokoll : tcp Service : compressnet Port : 2 Protokoll : tcp Service : compressnet Port : 3 Protokoll : tcp Port 4 : Keine Infos Service : rje Port : 5 Protokoll : tcp Port 6 : Keine Infos Service : echo Port : 7 Protokoll : tcp Port 8 : Keine Infos Service : discard Port : 9 Protokoll : tcp Port 10 : Keine Infos Service : systat Port : 11 Protokoll : tcp Port 12 : Keine Infos Service : daytime Port : 13 Protokoll : tcp Port 14 : Keine Infos Service : netstat Port : 15 Protokoll : tcp ... ... Service : swift-rvf Port : 97 Protokoll : tcp Service : tacnews Port : 98 Protokoll : tcp Service : metagram Port : 99 Protokoll : tcp Service : newacct Port : 100 Protokoll : tcp
| << zurück |
|
||||||||||||
|
||||||||||||
|
||||||||||||
Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich
ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen,
wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist
urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der
Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und
Verarbeitung in elektronischen Systemen.