Problem mit "connect" wenn Gegenstelle nicht existiert
-
JustSomeCoder schrieb:
SO_RCVTIMEO
das gibt's, damit 'recv' frühzeitig zurückkehren kann, wenn keine daten da sind. hat mit 'connect' eigentlich nichts zu tun.

-
@JustSomeCoder
Hallo, ja ich benutze Windows. Leider funktioniert dein Bsp.-Code nicht. Ich habe mich nun auch auf der Microsoftseite umgesehen, aber leider nichts über eine connect-timeout Sache herausfinden können.Also der Zeitserver schickt sofort nach der Connectanforderung die Zeit. Ich muss nach dem connect nicht erst noch irgendwas senden. Das Connect ist der Flaschenhals in diesem Fall. Ich habe ja in meine Quellcode Timerfunktionen eingebaut. bei 0ms wird der Socket bereitgestellt. Danach connect aufgerufen, nachdem connect zurückkehrt sind dann mehr als 20 Sekunden vergangen. Dieses Problem würde ich gerne lösen. Also irgendow muss man doch die connect-timeout einstellen können. Wenn es eine Betriebssysteminterne Sache ist, kann man die ja per Programm kurzzeitig umschalten und dann wieder zurückstellen, oder?
-
Ähm, keiner weiss eine Antwort. Heisst das man kann die Timeoutzeit für einen nicht existierenden/antwortenden Client nicht verstellen. Da muß doch irgendwo in der Registry oder sonst wo hinterlegt sein?
-
und wenns fest im Quelltext von Windows hinterlegt ist, hat man bei
einem unfreien Betriebssystem verloren
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
+fricky schrieb:
3. die icmp message abfangen, die vom server kommt, wenn der port zu ist. geht natürlich nur, wenn der server selber nicht down ist.
Dir scheint nicht klar zu sein dass, falls der Server die Verbindung aktiv ablehnt, connect auch sofort mit einem Fehler zurückkommt, und nicht blöd 20 Sekunden wartet. Dein boah-ich-bin-co-cool-und-voll-der-007 Vorschlag bezüglich ICMP Abfangen bringt also genau *garnix*.

-
OK Leute, nach intensiver Recherche in Netz habe ich folgenden aufschlussreichen Artikel entdeckt:
http://www.codeguru.com/forum/showthread.php?t=312668
Hier wird auch erklät wie sich die timeoutzeit unter Windows von ca, 20 s zusammensetzt: 1*3s + 2*3s + 4*3s = 21s
Aufgrund diese Artikels habe ich mal meinen Sourcecode angepasst und es klappt wirklich. Hier das Ergebniss/* ============================================== iNet_GetNTPTime holt sich die Zeit von einem Zeitserver Achtung WSA muss vorher initialisiert worden sein host : muss schon als uLong konvertiert angegeben werden timeout : die Timeoutzeit für die Verbindung in Millisekunden ping : Ping wird "gefüllt" und zurückgegeben ============================================== */ boolean iNet_GetNTPTime(u_long *ulTime, u_long host, int timeout_ms, int *ping){ SOCKET skt; SOCKADDR_IN addr; u_long ulFlag = 1, time_start, time_end, NonBlock = 1; fd_set fd_read; TIMEVAL tv; boolean back = FALSE, loop = TRUE; *ulTime = 0; *ping = 0; skt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(skt == INVALID_SOCKET){ return FALSE; } timeBeginPeriod(1); time_start = timeGetTime(); addr.sin_family = AF_INET ; addr.sin_port = htons(IPPORT_TIMESERVER); addr.sin_addr.s_addr = host; ioctlsocket(skt, FIONBIO, &NonBlock); connect(skt, (SOCKADDR *)&addr, sizeof(addr)); tv.tv_sec = 0; tv.tv_usec = timeout_ms*1000; FD_ZERO(&fd_read); fd_read.fd_count = 1; fd_read.fd_array[0] = skt; FD_SET(skt, &fd_read); if(select(0, &fd_read, NULL, NULL, &tv) != SOCKET_ERROR){ { Sleep(5); if(recv(skt, (char *)ulTime, 4, MSG_PEEK) > 0){ loop = FALSE; back = TRUE; } time_end = timeGetTime(); if((int)(time_end - time_start) > timeout_ms){ loop = FALSE; } }while(loop == TRUE); if(back == TRUE){ *ulTime = ntohl(*ulTime); } } time_end = timeGetTime(); timeEndPeriod(1); *ping = (int)(time_end - time_start); closesocket(skt); return back; }Wer's ausprobieren möchte kann "3708009603" für den uLong des Zeitserver übergeben
-
MSG_PEEK ist pfui...Das Sleep(5) auch.
-
hustenbär schrieb:
MSG_PEEK ist pfui...Das Sleep(5) auch.
Eine Begründung wäre hilfreich, ich will ja hier was lernen.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
http://support.microsoft.com/?scid=kb%3Ben-us%3B192599
http://tangentsoft.net/wskfaq/articles/lame-list.html
-
hustbaer schrieb:
Dein boah-ich-bin-co-cool-und-voll-der-007 Vorschlag bezüglich ICMP Abfangen bringt also genau *garnix*.
08/15 nicht 007, aber stimmt, hab's mit UDP verwechselt. TCP schickt ein RST wenn am port keiner lauscht.
