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



  • 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