Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

  • Autor

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.

  • Autor

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 ;)

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.