getaddrinfo(): servname not supported for ai_socktype
-
Hallo Forum!
Ich habe versucht diesen sehr, sehr simplen scanner in C zu schreiben, bekomme aber die Fehlermeldung des Titels (ob sich noch andere Fehler im Code verstecken weiß ich nicht). Das OS ist NetBSD 4.0.1. Wenn Ihr mir helfen könntet, wäre ich Euch schwer dankbar!!
#include <stdio.h> #include <sys/socket.h> #include <string.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> // Benutzung void usage() { printf("\n-------------------------------------------------------\n\n"); printf("Usage: simplescan <host> <startport> <endport>\n"); printf("You will scan in full connect mode --> logged 8)\n\n"); printf("-------------------------------------------------------\n\n"); } main( int argc, char *argv[]) { int sock; int status; int port; int startport; int endport; struct addrinfo hints, *res; // error checking if( argc != 4) { printf("\Parameter failure!\n"); usage(); return 1; } if( startport > endport) { printf("Startport bigger than endport!"); usage(); return 1; } startport = htons( atoi(argv[2])); endport = htons( atoi(argv[3])); // make sure structure addrinfo is empty. memset( &hints, 0, sizeof(hints)); // fill the struc addrinfo. hints.ai_family = AF_INET; // force IPv4 hints.ai_socktype = SOCK_STREAM; // see if all went right if( (status = getaddrinfo( argv[1], port, &hints, &res)) != 0) { fprintf(stderr, "\ngetaddrinfo(): %s\n\n", gai_strerror(status)); return 1; } else { printf("Scanning host %s\n", argv[1]); } // if all went right we now try to scan... sock = socket( res->ai_family, res->ai_socktype, res->ai_protocol); if( sock == -1) { printf("socket() failed!\n"); } for( port = startport; port <= endport; port++) { if( connect( sock, res->ai_addr, res->ai_addrlen) == 0) { printf("%i (%s)\n", port); } else { printf("%i (unknown)\n", port); } } close( sock); freeaddrinfo( res); return 0; }
-
Hi!
Der zweite Parameter von getaddrinfo muss ein char* sein.
-
paramet0r schrieb:
Hi!
Der zweite Parameter von getaddrinfo muss ein char* sein.Wie meinst du das?
-
hum schrieb:
paramet0r schrieb:
Der zweite Parameter von getaddrinfo muss ein char* sein.
Wie meinst du das?
Genau so wie er es sagte, vermutlich.
Der zweite Parameter von getaddrinfo ist "char const* service", nicht "int port". Darf aber auch NULL oder ein numerischer String sein (wenn hints.ai_flags & AI_NUMERICSERV), aber eben ein String.
-
Ok, danke!
Dann werde ich es beizeiten mal so machen! Und manpages besser/aufmerksamer lesen!
-
mich würde mal interessieren warum der compiler da nicht gemeckert hat.
-
ll schrieb:
mich würde mal interessieren warum der compiler da nicht gemeckert hat.
vielleicht hast du es einfach nur übersehen, oder deine eingestellte warnstufe ist zu niedrig.
-
Eigentlich hatte ich '-Wall' angegeben. Aber wahrscheinlich übersehen im Eifer des Gefechts...
-
Hm, wie zählt er denn dann die Ports hoch, wenn es ein 'character' ist? Ich habe da harte Probleme bei der Lösung?
Danke für Antworten!
-
Es ist nicht ein char, sondern ein C-String! Am einfachsten nimmt man einen Integer, zählt den hoch und Wandelt den Integer dann in einen C-String um.