T
so, ich hab die ganze sache jetzt mit select gelöst..
problem jedoch: falls der server während select läuft wieder erreichbar ist, scheitert der verbindungsaufbau trotzdem.
passiert wenn die dsl-leitung des servers überlastet ist...
meine idee ist das ich die timeouts auf z.b. 10 oder 15sec setze und den connect mit select mehrmals hintereinander aufrufe...
so bleibt er nicht hängen und wenn der server zwischendurch wieder erreichar ist funktioniert der verbindungsaufbau auch wieder und es gibt keinen failed to connect error...
oder was meint ihr?
dazu müsste ich ja folgenden block immer wieder nacheinander aufrufen(3 bis 4x (3,4 versuche von verbindungsaufbau))... aber geht das auch nicht simpler ?? d.h. das ich während select läuft den connect immer wieder "anstoße"?
/* Den Verbindungsaufbau anstossen */
if (connect(new_socket, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR)
{
/* Das schlägt normalerweise fehl, wobei der Fehler WSAEWOULDBLOCK
* darauf hinweist, daß der Verbindungsaufbau durchaus noch Erfolgreich
* sein kann, und der Aufruf nur fehlgeschlagen ist, weil er andernfalls
* blockieren würde, was ja absichtlich deaktiviert wurde.
*/
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
std::stringstream ctd_tmp;
ctd_tmp << time(NULL) - t_start;
ctd_tmp >> con_timediff;
abbruch = "1, ";
connect_success = false;
}
}
/* Deskriptor-Set zurücksetzen und mit dem zu verbindenden Socket belegen */
FD_ZERO(&fds);
FD_SET(new_socket, &fds);
/* Den gewählte timeout-Wert einsetzen */
timeout.tv_sec = 240;
timeout.tv_usec = 0;
/* Nun select aufrufen; dieses kehrt entweder nach Ablauf des Timeouts
* zurück, oder wenn der Socket zum Schreiben bereit ist, was genau dann
* passiert, wenn er erfolgreich verbunden wurde.
*/
ret = select(new_socket + 1, NULL, &fds, NULL, &timeout);
if (ret == SOCKET_ERROR)
{
std::cout << "call to select failed: " << WSAGetLastError() << std::endl;
connect_success = false;
}
/* Falls select zurückgekehrt ist, aber der zu verbindende Socket nicht
* im Deskriptor-Set vorhanden ist, war das Verbinden in der gegebenen
* Zeit nicht erfolgreich.
*/
if (FD_ISSET(new_socket, &fds) == 0)
{
std::stringstream ctd_tmp;
ctd_tmp << time(NULL) - t_start;
ctd_tmp >> con_timediff;
abbruch = abbruch + "2, ";
connect_success = false;
}