"bind error: Permission denied" - Fehler bei Netzwerkprogrammierung
-
Hallo,
ich schreibe grade einen einfachen TCP-Server.
Ich berufe mich hierbei auf den Quellcode von W. Richard Stevens' "Programmieren von UNIX-Netzwerken".
Mein Quellcode ist dieser:
#include "unp.h" #include <time.h> int main(int argc, char** argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family= AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(5001); bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); listen(listenfd, LISTENQ); for ( ; ;) { connfd = Accept(listenfd, (SA *) NULL, NULL); ticks=time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); write(connfd, buff, strlen(buff)); close(connfd); } return 0; }
Es wird alles richtig kompiliert, aber beim Starten des Programms kommt der Fehler
bind error: Permission denied
Das bedeutet ja, dass ich fuer den angegebenen Port keine Berechtigung habe. Ich bin kein Superuser und kann deshalb auch nicht die ersten 1024 Portnummern wählen, richtig?
(Im Buch wird auch Portnummer 13 verwendet, klappt natürlich auch nicht)
Welchen Port muss ich wählen, damit ich den Server starten kann?
-
Fabulus schrieb:
Ich berufe mich hierbei auf den Quellcode von W. Richard Stevens' "Programmieren von UNIX-Netzwerken".
Donnerwetter, ich bin überrascht, dass den heutzutage noch jemand liest.
Fabulus schrieb:
Das bedeutet ja, dass ich fuer den angegebenen Port keine Berechtigung habe. Ich bin kein Superuser und kann deshalb auch nicht die ersten 1024 Portnummern wählen, richtig?
Richtig erkannt, Schlussfolgerung nur bedingt richtig, du musst deine Ports erst freischalten (lassen);
welche defaultmäßig auf deinem System verfügbar sind, ist natürlich systemabhängig.
Keine Sache von C.
-
Ohne, dass ich micht jetzt sonderlich mit Unix-Netzwerken auskenne:
bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Bist du sicher, dass dieser Cast nicht irgendeinen Fehler deinerseits verdeckt? Wenn bind einen Zeiger auf ein sockaddr_in erwarten würde, wäre kein Cast notwendig, andernfalls sieht mir dein dritter Parameter fehlerhaft aus.
-
Also der castet nach struct sockaddr, wie es der bind-Befehl erwartet...
Das ist jedenfalls der Quellcode aus dem Buch, weiß aber auch nicht, was man aendern müsste
-
Der bind Befehl ist so schon richtig. Siehe auch
http://msdn.microsoft.com/en-us/library/ms737550(v=vs.85).aspxWelchen Port muss ich wählen, damit ich den Server starten kann?
Da hat C (wie schon erwähnt) nichts mit am Hut. Aber du kannst ruhig einfach irgendwelche Ports ausprobieren, viel falsch machen kann man da eigentlich nicht.
-
Wenn bind einen Zeiger auf ein sockaddr_in erwarten würde, wäre kein Cast notwendig, andernfalls sieht mir dein dritter Parameter fehlerhaft aus.
bind erwartet einen Zeiger auf eine struct sockaddr. Ob diese sockaddr eine Ipv4-Adresse (sockaddr_in) eine IPv6-Adresse (sockaddr_in6) oder was auch immer ist, ist dabei egal. Das hier ist also eine Art Vererbung aus der Objektorientierung. Der cast ist zwar hässlich aber er wird wirklich benötigt
-
Wutz schrieb:
Fabulus schrieb:
Ich berufe mich hierbei auf den Quellcode von W. Richard Stevens' "Programmieren von UNIX-Netzwerken".
Donnerwetter, ich bin überrascht, dass den heutzutage noch jemand liest.
Wieso das denn? Gibt es da bessere Alternativen? (Außer die englischen Bände natürlich)
Wie kann ich denn herausfinden, welche Ports für mich geöffnet sind?
Also Port 5001 und 5000 funktionieren jedenfalls bei meinem Java-Server, der genau das gleiche macht wie das obige C-Programm.
-
Ist der Port noch belegt? Was sagt denn netstat.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.