Mephisto81 Geschrieben 21. August 2004 Geschrieben 21. August 2004 Hi, hab ein ziemlich heftiges Problem mit nem Serversocket unter Linux und hoffe das mir einer von euch helfen kann. Ich erstelle einen Listen-Socket unter Linux was auch einwandfrei funktioniert. Woher ich annehme das das funktioniert hat? Ganz einfach: Rückgabewerte der Funktionen socket, bind und listen sind OK (keine negativen Rückgaben). Der Socket wartet auf Verbindungen auf Port 1524. Nachdem ich listen() aufgerufen hab und den Befehl "netstat -lpn | grep 1524" durchführe, zeigt mir der Befehl meinen Port als LISTEN-Port inklusive Prozess. Somit glaube ich das das geklappt hat. Das Komische ist jetzt allerdings, dass jeder Client-Socket von Windows aus, sich nicht auf meinen Linux-Host connecten kann. Unter Windows bekomme ich immer den Fehlercode 10061 "Connection refused" (Rückgabe "WSAGetLastError"). Ich benutze SuSE Professional 9.1 und habe unter Yast die Firewall abgeschaltet. Was könnte diesen Verbindungsabbruch noch bewirken? Gibt es noch eine Firewall oder ähnliches unter Linux was ich abstellen bzw konfigurieren müsste? (Info: IP-Adressen inklusive Ports habe ich überprüft. Pings zum und vom Linux-Rechner funktionieren auch einwandfrei, also denke ich mal das die Netzwerkverbindung einwandfrei ist.) thx im vorraus greetz mep
nic_power Geschrieben 21. August 2004 Geschrieben 21. August 2004 Hallo, poste doch bitte mal die Code des Linux-Server Programms. Ohne den Code zu kennen, sagt mir mein Bauch, dass Du auf Server Seite "accept()" vergessen hast. Nic
Mephisto81 Geschrieben 21. August 2004 Autor Geschrieben 21. August 2004 Hallo das mit dem code ist gerade schwer, weil ich net zuhause bin. Aber der Accept fehlt nicht Ich prüfe in einem separaten Thread mittels select den listen-socket ab und das funktioniert unter Windows einwandfrei, nur unter Linux gibt es das problem (der gleiche source). Ich setze unter Linux als ersten Parameter des select-aufrufs das größte socket-handle + 1. Der Socket wird korrekt in das entsprechenden read- und error-set gesetzt. Aber sobald sich mein client-connecten will, bekommt der select das kein stück mit. Er kommt immer nach zwei sekunden (das ist der timeout den ich als letzten Parameter des selects mitgebe) mit einem timeout (0) zurück. Einen Hinweis habe ich noch vergessen: ich setze mittels setsockopt(...) die Optionen TCP_NODELAY und SO_KEEPALIVE des Server-Sockets auf true. Ich denke das das problem eher auf system-seite zu suchen ist.
Mephisto81 Geschrieben 23. August 2004 Autor Geschrieben 23. August 2004 habs doch noch gefunden. der vollständigkeit halber: auf serverseite habe ich ungefähr folgendes gemacht (was unter Windows ohne Probleme funktioniert): (es handelt sich nur um einen Testcode weil der komplette source zu groß wäre ) /* .... */ int sock; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock != -1) { sockaddr_in server; memset(&server, 0x00, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(45000); // hier das Problem: server.sin_addr.s_addr = inet_addr("127.0.0.1"); int ires = bind(sock, (sockaddr*)&server, sizeof(server)); /* .... */ Das Problem war das in der gekennzeichneten Zeile nicht folgendes stand: server.sin_addr.s_addr = INADDR_ANY; Als ich das änderte klappte es einwandfrei. Irgendwie ist es aber doch eigenartig das das so einen Unterschied macht. Eigentlich "binde" ich mittels "bind" doch den Server-Socket an meine lokale Adresse was ja 127.0.0.1 ist (localhost-adresse). Anzumerken ist, das die Funktion nicht mit einem Fehler zurückkehrte auch wenn dort 127.0.0.1 als Adresse gesetzt war. Es war eben nur keine Verbindung unter Linux möglich. Naja hauptsache es klappt jetzt Vielleicht hat jemand noch ne idee woran das vielleicht lag? nur so wegen nem gewissen lerneffekt greetz und danke an nic der so schnell geantwortet hat
nic_power Geschrieben 23. August 2004 Geschrieben 23. August 2004 Hallo, Als ich das änderte klappte es einwandfrei. Irgendwie ist es aber doch eigenartig das das so einen Unterschied macht. Eigentlich "binde" ich mittels "bind" doch den Server-Socket an meine lokale Adresse was ja 127.0.0.1 ist (localhost-adresse). Anzumerken ist, das die Funktion nicht mit einem Fehler zurückkehrte auch wenn dort 127.0.0.1 als Adresse gesetzt war. Es war eben nur keine Verbindung unter Linux möglich. Naja hauptsache es klappt jetzt Vielleicht hat jemand noch ne idee woran das vielleicht lag? nur so wegen nem gewissen lerneffekt Die Adresse 127.0.0.1 ist nur lokal erreichbar, also von Prozessen die auf der Maschine laufen. Bindest Du den Socket an 127.0.0.1, so werden nur Anfragen angenommen, die auch lokal generiert werden. INADDR_ANY hingegen bindet den Socket an alle Interfaces, also auch an die, die von aussen erreichbar sind. Nic
Mephisto81 Geschrieben 23. August 2004 Autor Geschrieben 23. August 2004 hallo, achso... das erklärt natürlich einiges... kann mich auch irgendwie erinnern das mal gelesen zu haben muss es wohl irgendwie wieder vergessen haben *schäm*. thx und greetz :uli
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden