Zum Inhalt springen

Socketprogrammierung Linux - Problem


Mephisto81

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

das mit dem code ist gerade schwer, weil ich net zuhause bin. Aber der Accept fehlt nicht :rolleyes:

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

greetz und danke an nic der so schnell geantwortet hat ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...