[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 auslastungMfG
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 auslastungwü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 auslastungwü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?