Wenn ich versuche, Port 80 an einen Socket in c zu binden, bekomme ich immer den Fehler, dass ich keine Erlaubnis habe, diesen Port zu verwenden. Gibt es eine einfache Möglichkeit, diese Erlaubnis zu erhalten?Binden eines Sockets an Port 80 in ansic
Antwort
Normalerweise kann nur der Superuser (Root) an 'privilegierte' Ports binden (d. H. Diese Portnummern unter 1024).
Dies bedeutet, dass Sie entweder Ihr Programm als root ausführen müssen oder Ihre ausführbare Datei 'suid root' machen müssen.
Beide haben Sicherheitskonsequenzen, daher sollten Sie in Betracht ziehen, den suid-Ansatz zu verwenden und Superuser-Berechtigungen aufzugeben, sobald der Bindungsaufruf erfolgt ist.
Wenn Sie auf einem geteilten System (wie ein Universitätscomputer) und nicht root sind, dann gibt es keine "einfache" Möglichkeit, diese Erlaubnis zu bekommen, von Entwurf.
Sie finden this tutorial sehr hilfreich bei der Netzwerkprogrammierung mit C/C++.
Und übrigens, ANSI C hat keine Möglichkeit, auf das Netzwerk zuzugreifen. Es sind die vom Betriebssystem bereitgestellten Bibliotheken (die BSD-Socket-API, auch portiert nach Windows als winsock
), die diese Fähigkeit bereitstellen.
Beej's Guide für Sockets ist, was ich gelernt habe Socket-Programmierung an der Universität, zusammen mit Generationen von anderen Informatik-Studenten. Es ist sehr gut. Auch die Arbeiten von W. Richard Stevens sind ein gutes Tutorial in diesem Raum. – ConcernedOfTunbridgeWells
Ja, obwohl es wesentlich weniger Zeit braucht, um Beejs Tutorials zu lesen als Stevens 'Bibeln :-) –
Es ist genauso @Charles Bailey ausdrückt ... und ich mochte hinzufügen, dass aus diesem Grunde eine verwendeten HTTP-Server-Adressen auf 8080 von Portangabe in der URL als http://some.urlzu sehen: 8080/
Traditionell kann nur root Sockets an Ports unter 1024 binden.
Die Ports 1024 und darunter heißen Privilegierte Ports, die Bindung an diese Ports erfordert erhöhte Berechtigungen.
Ports über 1024 heißen Emphemere Ports. Die Bindung an diese erfordert keine besonderen Berechtigungen.
Der einfachste Weg, um Zugang zu priviligierten Ports zu erhalten, ist der Root-Benutzer.
Ja, Sie können problemlos an Port 80 binden. Verwenden Sie Apache. Schreiben Sie eine Webanwendung. Apache bindet sich an Port 80 und führt Ihre Webanwendung aus.
Versuchen Sie, den nächsten Apache zu schreiben? Wenn dies der Fall ist, müssen Sie sich über den API-Aufruf setuid in Ihrem Betriebssystem informieren.
Wenn Sie keine neue Version von Apache schreiben, verwenden die meisten Benutzer einen nicht privilegierten Port. 8000 ist beliebt, so ist 8080.
S.Lott Antwort kann sehr negative Reaktionen ausgelöst haben, aber seine Idee ist alles andere als dumm: Wenn die ursprüngliche Frage für ein echtes Programm (keine Schulaufgabe) ist, entwickeln sie als Anwendung hinter einem HTTP-Server ist oft eine vernünftige Wahl. Auf diese Weise können Sie viele Details auf niedriger Ebene einem guten und gut debuggten Programm, Apache, überlassen.
Die Anwendung muss kein CGI sein, es kann ein Apache-Modul sein. Apache, ab Version 2, ist nicht mehr nur ein HTTP-Server. Es ist jetzt eine Plattform, um Netzwerkprogramme zu entwickeln. Das Schreiben eines Apache-Moduls ist möglicherweise die richtige Antwort auf die ursprüngliche Frage (siehe Apache documentation)
Danke. Ich brauchte eine Weile, um zu erfahren, warum es privilegierte Häfen gibt. Es hat mit den Erwartungen zu tun - Sie erwarten das HTTP-Protokoll an Port 80, und es gibt bereits eine schöne Software, um dieses Protokoll für Sie zu handhaben. –
Normale Programme können keine "privilegierten" Ports binden - solche unter 1024.Dies ist eine weitgehend veraltete Sicherheitsfunktion von UNIX-ähnlichen Betriebssystemen.
Das Ausführen als ein Superuser, obwohl von vielen anderen hier vorgeschlagen, ist eine schlechte Lösung für dieses Problem. Wenn Sie auf einem Debian- oder Ubuntu-System laufen, schlage ich vor, das authbind-Paket zu installieren, mit dem Sie Ihrem Programm erlauben können, privilegierte Ports zu öffnen, ohne Ihrem Programm andere spezielle Berechtigungen zu geben.
Wenn Sie auf einem anderen System laufen, empfehle ich, Debian oder Ubuntu zu installieren ;-).
Ports 1024 und darunter werden eigentlich "privilegierte Ports" genannt, nicht "sichere Ports", alles über 1024 sind "ephemere Ports". Prost. – paxos1977