[Winsock] Ändern des timeout für connect()



  • Hallo an alle 🙂

    Mir wurde als aufgabe gegeben ein tool zu bauen das nach einer liste ip und ports nach bestimmten expressions heraussucht und sich anschließend auf diese verbindet um zu prüfen ob der entgegengesetzte host online ist. Wenn ja soll sich das programm darauf verbinden und ebenso vorgebene daten senden. es geht hierbei um ziemlich alte systeme die noch über telnet verwaltet werden (im LAN).

    jetzt habe ich bereits alles implementiert und ich kann mich auch wunderbar auf die ports verbinden um anschließend die daten zu senden. das eigentliche problem dabei ist jetzt aber, dass wenn ein host nicht online ist muss man ewig warten bis das timeout mit fehler eintrifft.

    meine frage ist nun, wie kann ich den timeout für den connect() befehl ändern? bzw welche möglichkeiten gibt es (außer vorher anpingen) das ganze so umzubauen das es nicht blockiert oder ähnlich?

    am besten wäre einfach ein einstellbarer timeout, da hier die latenzen im lan nie höher sind als 20 ms könnte man das ja wunderbar auf 100 ms einstellen 😉
    habe bereits google ausführlich befragt und das timeout über select eingestellt, aber das kommt ja erst _nach_ einem connect 😞 das ganze auf threads auslagern kam mir auch schon in den sinn, aber geht ja dann eher am eigentlichen problem vorbei...

    bin für jeden sinnvollen tipp dankbar :xmas1:

    MfG
    RadiatioN



  • Radiation2K5 schrieb:

    meine frage ist nun, wie kann ich den timeout für den connect() befehl ändern?

    hi,
    ich hatte auch mal so'n problem, hab' aber nix gescheites gefunden. ich habe es dann mit nonblocking sockets gemacht und die zeit selber gemessen...

    btw: kann sein, dass es mit einer registry-einstellung geht.



  • bin mittlerweile mit rumprobieren auf eine lösung gekommen.
    sockets auf non-blocking modus umstellen und dann in einer schleife solange recv() und WSAGetLastError() aufrufen bis kein fehler mehr kommt oder timeout erreicht wurde 😉 das is echt wunderbar jetzt wird die liste mega schnell durchgegangen *juhu*

    hier für anderen die mal das gleiche problem haben sollten:

    //weiter oben nur das übliche an Sockets code
    	sConn = socket(PF_INET, SOCK_STREAM, 0);
    
    	if(sConn==INVALID_SOCKET)
    	{
    		return FALSE;
    	}
    
    	if(ioctlsocket(sConn, FIONBIO, &ulNonBlocking)!=0)
    	{
    		return FALSE;
    	}
    
    	dwLastTick=GetTickCount();
    
    	connect(sConn, (SOCKADDR*)&siAddr, sizeof(SOCKADDR));
    
    	while((dwLastTick + iMsTimeout)>GetTickCount())
    	{
    		recv(sConn, szTemp, 5, 0);
    
    		if(WSAGetLastError()==0)
    		{
    			//weitermachen mit daten senden/empfangen
    			//verbindung erfolgreich
    			return TRUE;
    		}
    	};
    
    	//wenn hier angekommen verbindung fehlerhaft oder kann nicht hergestellt werden
    	return FALSE;
    

    [EDIT]
    net, danke für den tipp 😉
    für längere timeouts ist vllt noch ein Sleep(1) nach der if Prüfung in der schleife zu empfehlen 😉 rein schonma wegen der CPU auslastung

    MfG
    RadiatioN



  • non-blocking socket + select()



  • Radiation2K5 schrieb:

    für längere timeouts ist vllt noch ein Sleep(1) nach der if Prüfung in der schleife zu empfehlen 😉 rein schonma wegen der CPU auslastung

    würd' ich immer machen bei solchen schleifen, Sleep(50) oder sowas...



  • net schrieb:

    Radiation2K5 schrieb:

    für längere timeouts ist vllt noch ein Sleep(1) nach der if Prüfung in der schleife zu empfehlen 😉 rein schonma wegen der CPU auslastung

    würd' ich immer machen bei solchen schleifen, Sleep(50) oder sowas...

    Frickler unter sich. 😉



  • Kenner der Frickler schrieb:

    Frickler unter sich. 😉

    geht aber. man hat sein polling und das system lagt nicht. was willste mehr?



  • Kenner der Frickler, dann schlag eine bessere lösung vor :xmas2:
    bin für alles offen.

    MfG
    RadiatioN



  • ich denke mal WSAEventSelect + WaitForSingleObject ist die sauberste und einfachste Lösung.



  • .......... schrieb:

    ich denke mal WSAEventSelect + WaitForSingleObject ist die sauberste und einfachste Lösung.

    das hilft nix. man kriegt ja keine events während versucht wird, eine verbindung aufzubauen. erst danach (entweder hat geklappt oder time-out).



  • Ich denke auf nen längeres Timeout wird man wohl nicht kommen... ausserdem... es werden pro connect() doch sowieso immer nur max. 3 SYN geschickt, oder?



  • hustbaer schrieb:

    Ich denke auf nen längeres Timeout wird man wohl nicht kommen...

    länger ist ja nicht das ding. wenn man's länger versuchen will, dann muss man eben mehrere 'connect's nacheinander ausführen. den time-out früher zu kriegen ist das problem...



  • Radiation2K5 schrieb:

    Hallo an alle 🙂

    habe bereits google ausführlich befragt und das timeout über select eingestellt, aber das kommt ja erst _nach_ einem connect 😞

    damit kann man doch auch anstehende verbindung überprüfen?


Anmelden zum Antworten