Socket verbindungstest

fettyteddy

Grünschnabel
Hey,

ich habe unter Linux (C++) einen Client geschrieben. Dieser läuft mit zwei thread zum senden und empfangen von Daten.

Soweit läuft der Client ohne Probleme, bis der Server meine Verbindung schließt, was immer mal vorkommen kann. Testweise habe ich einfach mal das Netzwerkkabel gezogen. Aber wie kann ich prüfen ob eine Verbindung noch besteht?

Ich bin davon ausgegangen, wenn keine Verbindung besteht und ich send ausführe, das ich einen Fehler erhalten müsste.

if (send(socketDescriptor, buf_out, strlen(buf_out) + 1, 0) < 0) {
cerr << "cannot send data ";
objWriteLogFile.writeline_log_file("cannot send data");
close(socketDescriptor);
exit(1);
}

doch es wird kein Fehler ausgeben. Alles ist, als würde die Verbindung noch bestehen. Nur irgendwie muss ich eine Verbindungsprüfung machen, um festzustellen wann ich neu Verbinden muss.

auch

if (socketDescriptor < 0) {
objWriteLogFile.writeline_log_file("connection off");
cout << "socketDescriptor connection off" << endl;
} else {
objWriteLogFile.writeline_log_file("connection on");
cout << "socketDescriptor connection on" << endl;
}

zeigt eine bestehende Verbindung an (socketDescriptor connection on). Doch ohne Netzwerkkabel keine Verbindung!

Wäre schön wenn mir bei dem Problem jemand helfen könnte!
Danke
 
Hi.

Welche Art von Socket hast du denn kreiert?

Hast du den Absatz in der Manpage schon gelesen:
man 2 socket hat gesagt.:
The communications protocols used to implement a SOCK_STREAM insure that
data is not lost or duplicated. If a piece of data for which the peer
protocol has buffer space cannot be successfully transmitted within a
reasonable length of time, then the connection is considered broken and
calls will indicate an error with -1 returns and with ETIMEDOUT as the
specific code in the global variable errno. The protocols optionally
keep sockets ``warm'' by forcing transmissions roughly every minute in
the absence of other activity. An error is then indicated if no response
can be elicited on an otherwise idle connection for a extended period
(e.g. 5 minutes). A SIGPIPE signal is raised if a process sends on a
broken stream; this causes naive processes, which do not handle the sig-
nal, to exit.
Gruß
 
ja habe ich gelesen. Bin auch davon ausgegangen nen -1 zu erhalten. Doch es kommt als Rückgabe keine -1.


Habe einen SOCK_STREAM kreiert.


---------------------------------------------------------------------------------------------

...

//SOCKET
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
cerr << "cannot create socket\n";
exit(1);
}

//IP
serverAddress.sin_family = hostInfo->h_addrtype;
memcpy((char *) &serverAddress.sin_addr.s_addr, hostInfo->h_addr_list[0], hostInfo->h_length);
serverAddress.sin_port = htons(serverport);

//CONNECT
if (connect(socketDescriptor, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
cerr << "cannot connect\n";
exit(1);
}

...

//MULTI THREAD ERSTELLT

//-SEND THREAD-
while (true) {

...
//keine Daten zum senden da

sleep(20);
...

//Daten zum senden vorhanden

if (send(socketDescriptor, buf_out, strlen(buf_out) + 1, 0) < 0) {
cerr << "cannot send data ";
close(socketDescriptor);
exit(1);
}

...

}

----------------------------------------------------------------------------------
so läuft der SEND THREAD immer wieder durch. Irgendwann in dieser Schleife ziehe ich das Netzwerkkabel und normal müsste die Sendfunktion doch in "cannot send data " gehen oder
 
Hi.

Bitte mache dich mal mit dem Forum hier vertraut, editiere deinen Betrag und verwende die Code-Tags ([c]...[/c] für C bzw. [code=cpp]...[/code] für C++ Code) da dein Code so relativ unleserlich ist.

Gruß
 
Stattdessen bekomme ich wie üblich bei der Send Funktion die Anzahl der versendeten Bytes zurück.

Ich habe noch mal einige teste gemacht. Zwei Funktionen.

Funktion1:
Eine mit einer Schleife, die nach 20 Sekunden immer etwas sendet (send)

Funktion2:
Eine Schleife mit der recv-Funktion (im Wartezustand).

Wenn ich das Netzwerkkabel abziehe:

Funktion1: Send läuft fröhlich weiter, als wäre nichts gewesen. Gibt kein -1 zurück, sondern die Anzahl der Bytes, die ich auch übergebe.
Funktion2: Bleibt die recv Funktion im Wartezustand! (Gibt auch kein -1 zurück).

Stecke ich das Kabel wieder ein:

Connectet der Client automatisch wieder. Die Senden Funktion läuft normal weiter und die Daten (Antworten auf die Anfrage) werden auch wieder empfangen.

Aktuelle Lösung:
-----------------------------
Ich habe leider keine Möglichkeit gefunden um zu testen, dass die Verbindung auch wirklich besteht. Daher sende ich nun aller halbe Stunde in einer dritten Funktion einen Datensatz und prüfe, ob daraufhin eine Antwort eingetroffen ist. Wenn nicht, führe ich einen Reconnect durch.
Nicht die Lösung, die ich mir vorgestellt habe, aber leider scheint das ganze nicht anders zu gehen.
 
Zuletzt bearbeitet:
Zurück