Socket Programmierung
-
Guten Tag,
ich besitze 2 PCs, einen etwas älteren und einen neuen. Auf dem neuen läuft Windows 7 und auf den alten habe ich jetzt Ubuntu 13.10 Server aufgespielt. Auf dem alten PC will ich nun mehr einen FTP Server aufbauen. Dieser soll selbst geschrieben sein. Um so einen FTP Server zu benutzen sollte man erstmal eine Verbindung zwischen den beiden PCs aufbauen. Diese hatte ich vor mithilfe von Sockets zu schreiben. Dies ist nun alles getan und es stellt auch wunderbar eine Verbindung her. Jetzt der Haken, die Verbindung kann nur mit der IP welche der Server im LAN hat hergestellt werden d.h. ich benutze eine IP 192.168.xxx.xxx dies funktioniert wie gesagt wunderbar, aber wenn ich den Server über die IP übers Internet ansprechen will hängt sich der Server auf. Der alte PC mit dem Ubuntu hat keine Graphische Oberfläche, also habe ich die globale IP mithilfe des Bfehels "curl http://ident.me" herausgefunden. Diese IP habe ich auf dem Windows PC eingegeben, damit sich das Socket mit dieser IP und dem vorher festgelegten Port verbindet. Wie bereits gesagt der Server auf dem ubuntu-PC hänggt sich bei dem accept call auf und der Windows-PC kriget einen WSAGetLastError() von 10060 also Timeout. Den Port über welche ich mich verbinden will habe ich bereits freigeschaltet. Dies habe ich mit dem Befehl "sudo ufw allow x" gemacht ( x steht für die Portnummer ). Meine eigentliche Frage ist nun, wie kann ich den Windows PC über die "globale IP" mit dem Server verbinden?
-
warum willst du über nicht-lokale adressen gehen?
wie auch immer: du musst deinem router dann sagen, dass er port forwarding betreibt.
also sagen wir deine globale ip ist 188.40.141.82.
nun hängt pc1 und auch pc2 am router, und haben die gleiche ip.
also musst du dem router noch sagen, dass eingehender verkehr mit tcp port 12300 auf pc1 weitergeleitet wird, und auf tcp port 12301 wird an pc2 weitergeleitet.nun kannst du unter 188.40.141.82, port 12300 den einen, und unter 188.40.141.82, port 12301 den anderen pc erreichen.
und was heißt, der linux rechner hängt sich bei "accecpt" auf? das ist ein syscall, und der blockiert den thread bis eine eingehende verbindung kommt.
kann es sein, dass sich das programm nicht aufhängt, sondern nur schläft?
hier der auszug aus der man page:
If no pending connections are present on the queue, and the socket is not marked as nonblocking, accept() blocks
the caller until a connection is present.
-
Danke f[r die schnelle Antwort,
Um erstmal deine Fragen zu beantworten, ich will nicht über die lokale IP gehen, da ich den Server auch gerne von außerhalb des lokalen Netzwerks benutzen würde. Ich will die Dateien, welche auf dem Server liegen auch vom Laptop der Uni aus ansprechen, dies geht dann natürlich nicht mehr über die lokale IP. Das mit dem port forwarding werde ich möglichst bald versuchen, und die Resulate weitergeben. Der Server hängt sich in dem Sinne auf, das keine Graphische Oberfläche installiert ist, also nur das Terminal. Wenn sich das Programm welches ich mit dem Befehl "./Server.exe" blockiert wird oder sich schlafen legt durch den accept() call, da keine Verbindung hergestellt wird, kann ich das Programm nur durch einen Neustart des PCs beenden. Da es keinen Task Manager gibt und ohne grafische Oberfläche, habe ich bisher noch keine Möglichkeit gefunden das Programm wieder zu beenden sobald es läuft und keine Verbindung annnimmt. Dies werde ich beheben, indem ich den accept() call in einen seperaten Thread packe.
-
SprT schrieb:
Da es keinen Task Manager gibt und ohne grafische Oberfläche, habe ich bisher noch keine Möglichkeit gefunden das Programm wieder zu beenden
Drücke einfach Ctrl-C. Wenn du direkt an der Maschine sitzt, kannst du auch Alt-F2 drücken und dich dort anmelden. Ansonsten eine frische SSH-Session eröffnen. Dein Programm kannst du dann mit
killall programmname
abschießen.
-
Je nach Router geht das trotzdem nicht. Ein 2. Rechner im internen Netz ist bei z. B dem ollen Telekom Sinus irgendwas von 2005 grundsätzlich mit der öffentlichen IP trotz Pord-Forwarding nicht erreichbar. Mit nem echten externen Rechner klappts aber dann - nur so als Hinweis. Hab da selbst Stunden mit Fehlersuche verbracht.
-
kannst dein Programm auch mit STRG+Z pausieren, und dann mal mit dem Befehl top den Taskmanager anzeigen.
Wenn du dann das Programm weiter ausführen möchtest, kannst du es mit fg zurück in den Vordergrund holen, oder mit bg in den Hintergrund legen. Dann kannst du die Shell weiterhin bedienen, während dein Programm im Hintergrund weiterläuft.Ansonsten bietet sich zum Debuggen das Programm gdb an, damit sieht du genau, was dein Programm tut. Und ich behaupte mal, dass es einfach im syscall hängt bis eine Verbindung kommt.
-
Alles klar vielen Dank euch allen :DDD, dachte schon ich müsste den PC immer neu starten wenn sich irgend ein Programm von mir aufhängt. Zufällig habe ich so ein Router vom ollen Telekom :(, aber das mit dem externen Rechner werde ich möglichst bald versuchen, danke für eure Hilfe.
MfG SprT
-
SprT schrieb:
Zufällig habe ich so ein Router vom ollen Telekom :(, aber das mit dem externen Rechner werde ich möglichst bald versuchen,
Du koenntest alternativ auch deinen normalen Rechner logisch ausserhalb deines Hausnetzes platzieren. Wenn du deinen Rechner per VPN mit deiner Uni oder einer anderen Geschichte verbindest (z.B. http://hidemyass.com/ ), dann wird deine Verbindung erstmal nach draussen getunnelt und von dort aus hast du dann einen "externen" Rechner.