ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
1458
1458
EMPFEHLEN
-
04.11.08 15:06 #1
- Registriert seit
- Feb 2007
- Beiträge
- 10
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
-
04.11.08 15:29 #2
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Welche Art von Socket hast du denn kreiert?
Hast du den Absatz in der Manpage schon gelesen:
Gruß
Zitat von man 2 socket
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
04.11.08 15:57 #3
- Registriert seit
- Feb 2007
- Beiträge
- 10
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
-
04.11.08 16:05 #4
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Bitte mache dich mal mit dem Forum hier vertraut, editiere deinen Betrag und verwende die Code-Tags ([c]...[/c] für C bzw. [cpp]...[/cpp] für C++ Code) da dein Code so relativ unleserlich ist.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
04.11.08 16:16 #5
- Registriert seit
- Feb 2007
- Beiträge
- 10
werde ich tun!
-
"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
05.11.08 11:59 #7
- Registriert seit
- Feb 2007
- Beiträge
- 10
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.Geändert von fettyteddy (05.11.08 um 12:01 Uhr)
Ähnliche Themen
-
Script zum Verbindungstest?
Von Niklas1812 im Forum PHPAntworten: 3Letzter Beitrag: 06.02.10, 11:05 -
MySql verbindungstest ohne PHP Fehlermeldung?
Von trage im Forum PHPAntworten: 3Letzter Beitrag: 23.05.09, 10:18 -
Hibernate Verbindungstest
Von RealHAZZARD im Forum JavaAntworten: 4Letzter Beitrag: 27.02.09, 09:57 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 30.01.08, 10:24 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 29.01.08, 14:59





Zitieren

Login





