Server soll Dateneinlesen selbstständig beenden

Hallo.
Mir stellt sich folgendes Probelm:
Ein Software-Server unter C liest Telegramme beliebiger Länge ein und verarbeitet diese wie gewünscht. Nun kommt es leider vor, dass einer der Clients, die sich verbinden, diese Verbindung nicht mehr schliesst. Mein Server erwartet jedoch ein Beenden, um weiter zu arbeiten. Eine „Standleitung“ ist aus mehreren Gründen nicht möglich und scheidet aus. Kann ich den Server irgendwie beim Start so parametrieren (über Flags?), dass er automatisch n Sekunden einen nicht gescholssenen Connect beendet und auf die nächste Verbindung wartet? Wenn die vollständig gesendeten, aber nicht korrekt abgeschlossenen Daten verloren wären könnte ich damit leben.

Aufbau ist Standart.
Den ganzen Logfile-Kram, Kontroll-Gefummel hab ich zur Anschauung weggelassen und hoffentlich nicht zuviel „entsorgt“. Fakt ist, mir fehlt nur diese beschreibene Funktion. Sonst ist alles OK.

    serv_addr.sin_port        = htons(MY_SERVER_PORT);
    serv_addr.sin_family      = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;

if ( ( retval = bind ( sockfd, ( struct sockaddr* ) &serv_addr, sizeof ( serv_addr ) ) ) 0 );

Danke für jede Antwort

Hi,

Mir stellt sich folgendes Probelm:
Ein Software-Server unter C liest Telegramme beliebiger Länge
ein und verarbeitet diese wie gewünscht. Nun kommt es leider
vor, dass einer der Clients, die sich verbinden, diese
Verbindung nicht mehr schliesst.

ja, das sollte man beachten, weshalb die Telegramme auch eine Längenangabe vorweg schicken sollten, damit man ueberhaupt weiss, wieviel Daten noch erwartet werden.

den Server irgendwie beim Start so parametrieren (über
Flags?), dass er automatisch n Sekunden einen nicht
gescholssenen Connect beendet und auf die nächste Verbindung
wartet?

zunaechst einmal sollte deine Software Multiconnect-faehig sein (also entweder einen eigenen Prozess pro Session oder einen eigenen Thread).

Punkt 2: Nein, etwas derartiges gibt es in C/C++ nicht, denn C/C++ kennen ueberhaupt keine Sockets.

Wenn du aber von der Socket-Library sprichst, so haben viele dort eine Funktion, die select() heisst, oder poll(). Bei denen kann man ein Zeitintervall angeben bis zu dem ein Socket Daten anliefern soll. Verstreicht die Zeit ohne eingehende Daten, kehrt die Funktion mit einem entsprechenden Fehlercode zurueck.

Voll flexible und idiotensicher wird die Funktion entweder mit der genannten Längenangabe vorweg oder mit non-blocking sockets. Diese Eigenschaft kann man per setsockopt setzen, muss dann aber einige Sachen selber machen.

Final: Baust du Sockets ab, so solltest du ein entsprechendes shutdown Kommando vor dem close() benutzen.

Gruss
E.