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 Zitieren
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 Zitieren
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. Zitieren
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 Zitieren
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 Zitieren
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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.