PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfen ob socket noch verbunden ist



deki
16-11-2003, 15:13
Hallo!

Wie kann man in C/C++ prüfen, ob ein Socket noch verbunden ist.
Ich will praktisch bei einem Server eine while Schleife solange durchlaufen lassen,
wie der Client auch verbunden ist.
Erst wenn der Client die Verbindung abbaut soll der Server wieder neue Verbindungen annehmen.

MfG
deki

Edit: Das ganze natürlich unter Linux mit den normalen Linuxsockets.

comrad
18-11-2003, 09:45
hi


probier einfach mal:

if (socket)
{
printf ("verbindung besteht\n");
}
else
{
printf ("keine verbindung\n");
}

anda_skoa
18-11-2003, 15:42
Das geht nicht, der Socket ist ein Filedescriptor und damit ein int.
Das wäre praktisch immer wahr.

Man könnte es mit einem poll oder select versuchen.

Ein verbundener Socket müsste im Normalfall zum Schreiben bereit sein, wenn nicht gerade reingeschrieben wurde.

Ciao,
_

Badsteve
18-11-2003, 16:32
hi,

solange ein Socket verbunden ist gibt er doch bei einem recv etc. immer Zahlen größer als 0 zurück, wenn er dann nicht mehr verbunden ist, dann gibt er -1 zurück. Zumindest habe ich das so in Erinnerung.

Steve

Silver
18-11-2003, 18:55
Original geschrieben von Badsteve
hi,

solange ein Socket verbunden ist gibt er doch bei einem recv etc. immer Zahlen größer als 0 zurück, wenn er dann nicht mehr verbunden ist, dann gibt er -1 zurück. Zumindest habe ich das so in Erinnerung.

Steve

jep, so hab ich das auch immer gemacht!

mfG

deki
19-11-2003, 13:05
Hallo!

Vielen Dank für die Antworten.
Ich habe gerade den Vorschlag mit recv und -1 ausprobiert.

Mein Code sieht gerade ungefähr so aus:

while (true)
{
bool connected; // Hier wird der Connect Status gespeichert
if ( (client_socket = accept (server_socket, NULL, 0) ) == -1) // Server akzeptiert Verbindungen
return -1;

connected = true;

char recv_buffer[1024]; // Buffer für empfangene Daten
int received; // Länge der empfangenen Daten

while (connected)
{
if ( (received = recv (client_socket, recv_buffer, sizeof(recv_buffer)-1, 0) ) == -1) // Hier werden die daten empfangen
{
connected = false; // Falls -1 zurückgeliefert wird, wird Status auf Disconnected
break; // gesetzt und while Schleife durch break; unterbrochen
}
recv_buffer[received] = '\0';

handle_buffer (recv_buffer); // Funktion, die die empfangenen Daten auswertet
}
}
Allerdings funktioniert das auch nicht.
Wenn ich mit NetCat connecte und durch STRG-C wieder die Verbindung beende, geht er aus der "while (connected)" Schleife nicht raus, sondern
bleibt in der Schleife drin.
Da er aber nix mehr empfangen kann, steigt die CPU Auslastung auf 100% an ;)

Shack
19-11-2003, 15:48
welchen Wert hat den 'received' nachdem der Client sich getrennt hat.

Im übrigen kann read() & recv() nur im Zusammenhang mit einem verbundenen Sockets aufgerufen werden. Vieleicht hilft Dir das weiter in Bezug auf 'received'

recvfrom() kann dagegen jederzeit aufgerufen werden.

cu Shack

deki
19-11-2003, 16:01
Vielen Dank für die Antwort.
Ich hab jetzt nach der if Abfrage einfach mal den wert von received ausgeben lassen.
Wenn ich mit dem Client die Verbindung trenne, hat received den Wert 0.
Und das wird dann unendlich oft ausgegeben, bis ich den Server kille *gg* :D
Anscheinend liefert recv 0 zurück, wenn keine Verbindung mehr besteht.
Wenn ich jetzt teste, ob received den Wert 0 hat, und dann die Schleife verlasse, nimmt der Server wieder neue Verbindungen an.

Mein Problem ist admit also gelöst!
Vielen Dank an alle die geantwortet haben!


PS:
Ich habe gerade in der man-Page von recv entdeckt, dass tatsächlich 0 zurückgegeben wird, wenn die verbindung abgebaut wird.

RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.