bind() liefert immer -1 (Cannot bind socket)
-
hey.
Problem: Socket kann nicht gebunden werden.
Vorweg folgendes: Ich programmiere unter Linux (Ubuntu), mein Ziel war es, einen Client und einen einfachen Server zu programmieren, die vorläufig nichts weiter tun sollten als eine Verbindung über tcp/ip aufzubauen und eine Nachricht zu übertragen.
Beim Client hatte ich keine Schwierigkeiten, jedoch komm ich beim Server einfach nicht weiter.
Nach der Syntax und Infos über bind() zu suchen hat mir nicht weitergeholfen.Nun habe ich folgendes Problem:
Die Funktion bind() zum Binden des Sockets liefert immer -1 zurück.Zunächst habe ich einen Socket erstellt (sock()) und IP, Port und all die nötigen Daten festgelegt.
Das compilieren funktioniert problemlos, nur der Socket kann nicht gebunden werden.Ich hoffe auf eure Hilfe!
Schon mal danke im Voraus für eure Bemühungen!
lg, Platon
-
Zeig uns doch mal deinen Code.
-
Auf das Wesentliche reduziert ist mein Code folgender:
//Allg. Includes #include <stdio.h> //strcmp() #include <string.h> //exit() #include <stdlib.h> //Includes für Netzwerkprogrammierung //socket(), connect(), send(), recv(), bind(), listen(), accept() #include <sys/types.h> #include <sys/socket.h> // #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> //close() #include <unistd.h> #define SERVER_PORT 1500 #define SERVER_IP "127.0.0.1" #define SERVER_NAM "SERVER" int main(void) { int insock; struct sockaddr_in inaddr; (void)fprintf(stderr, "Server is up and running ...\n"); insock = socket(AF_INET, SOCK_STREAM, 0); if(insock == -1) //Fehler beim Erzeugen des Sockets { (void)fprintf(stderr, "%s (%s): Cannot open socket.\n",SERVER_NAM, SERVER_IP); exit(1); } inaddr.sin_family=AF_INET; inaddr.sin_port=htons(SERVER_PORT); inaddr.sin_addr.s_addr=INADDR_ANY; if((bind(insock, INADDR_ANY, 0)) == -1) // <-- HIER IST DAS PROBLEM :-) { (void)fprintf(stderr, "%s (%s): Cannot bind socket.\n", SERVER_NAM, SERVER_IP); exit(1); } ... restlicher code (serverschleife etc. - socket schließen usw.) ... return 0; }
Wie gesagt liefert hierbei bind() immer -1.
btw.: Hätte das Thema in die Kategorie Linux gehört? Sollte das so sein möchte ich mich hierfür entschuldigen, hatte diese Kategorie übersehen.
Thx für die schnelle Antwort!
lg, Platon
-
Platon schrieb:
if((bind(insock, INADDR_ANY, 0)) == -1) // <-- HIER IST DAS PROBLEM :-)
Schau dir zweiten Parameter mal etwas genauer an
-
Seh da auf Anhieb nix falsches, habe aber schon lange keine Netzwerkgeschichten mehr gecodet.
2 Ansätze:
-
Hier findest du Fehler, die bind zurückliefert. Schau mal nach, was '-1' bedeutet, vielleicht findest du dann schon den Fehler:
http://www.hmug.org/man/2/bind.php -
Musst du nirgends die Server IP verwenden??
-
-
INADDR_ANY soll soweit ich weis bewirken, dass der Server Verbindungsanfragen von jeder beliebigen IP annehmen kann. Allerdings hab ich schon 3 oder 4 Varianten gefunden (und probiert), wie die Parameterliste von bind() zu füllen ist.
@MFK: Was hättest du denn anders gemacht? Kann sein das ich was nicht bedenke!
Die Idee mit den Felercodes find ich gut, werd das gleich mal probieren.
Die Server IP muss ich deswegen nicht verwenden, weil dem Server seine eigene IP egal ist, solange er Verbindungsanfragen von allen IP's (INADDR_ANY) zulässt, oder so.
Möglicherweise brauch ich die dann bei der Datenübertragung, aber jetzt bin ich schon mal glücklich wenn das mit dem Socket geht!Thx inzwischen!
lg, Platon
-
MFK schrieb:
Platon schrieb:
if((bind(insock, INADDR_ANY, 0)) == -1) // <-- HIER IST DAS PROBLEM :-)
Schau dir zweiten Parameter mal etwas genauer an
da hat er recht. wozu ist denn die 'inaddr' da?
-
struct sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(ip) == INADDR_NONE ? INADDR_ANY : inet_addr(ip); sa.sin_port = htons(port); bind(listener_socket, (struct sockaddr *) &sa, sizeof(sa))
benutzen
-