Wie setzen Sie Keepalive auf Windows Server 2008
Ich habe win32-Anwendung in die winsock verwendet für TCP/IP-Kommunikation.
Ich bin Einstellung keepalive-Wert mit WSAIoctl-Funktion und es ist arbeiten normalerweise mit windows XP.
Aber auf Win. Server 2008 WSAIoctl fehl, und WSAGetLastError gibt 10022(ungültige Argumente), die macht keinen Sinn.
Mein code setzt keepalive ist folgt;
//set per-connection keep-alive option
tcp_keepalive keepAliveSettings;
keepAliveSettings.onoff = 1;
keepAliveSettings.keepalivetime = 500;
eepAliveSettings.keepaliveinterval = 25;
int lastError = WSAIoctl(m_soc.chns[0], SIO_KEEPALIVE_VALS, &keepAliveSettings, sizeof(keepAliveSettings), NULL, 0, &BytesReturned, NULL, NULL); if(lastError == SOCKET_ERROR) { lastError = WSAGetLastError(); Logger::Error("Setting keepalive failed ErrCode %d\n",lastError); }
EDIT:
Fand ich die Lösung, vielleicht kann jemand anderes helfen, die vor demselben problem. Ich war versucht, keepalive-kurz nach dem async. verbinden Sie anrufen, aber jetzt bin ich der Einstellung nach Abschluss der Aufruf verbinden und diese lösen das Problem.
Vom http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx
Unter Windows Vista und höher, die
Socketoption SO_KEEPALIVE nur
mit der Verwendung der setsockopt-Funktion, wenn
der sockel ist in einem bekannten Zustand
nicht ein übergangszustand. Für TCP, die
Socketoption SO_KEEPALIVE werden sollte
setzen Sie entweder vor dem connect-Funktion
(verbinden, ConnectEx, WSAConnect
WSAConnectByList, oder WSAConnectByName)
genannt wird, oder nachdem die Verbindung
Anforderung ist eigentlich abgeschlossen. Wenn die
die Funktion connect aufgerufen wurde
asynchron, dann erfordert dies
warten für die Verbindung Fertigstellung
bevor Sie versuchen, SO_KEEPALIVE
socket-option. Wenn eine Anwendung
versuche, die SO_KEEPALIVE
socket-option, wenn eine Verbindung
Anfrage ist noch in Bearbeitung, die
setsockopt-Funktion fehl und
zurück WSAEINVAL.
InformationsquelleAutor AFgone | 2010-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Lösung, vielleicht kann jemand anderes helfen, die vor demselben problem.
Ich war versucht, keepalive-kurz nach dem async. verbinden Sie anrufen, aber jetzt bin ich der Einstellung nach Abschluss der Aufruf verbinden und diese lösen das Problem.
Aus http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx
FYI, Stackoverflow können Sie Ihre eigene Frage zu beantworten nach zwei Tagen.
InformationsquelleAutor AFgone
Wahrscheinlich der kernel ist Einspruch gegen Ihre Entscheidungen von Werten. Ich würde. Sie können nicht ernsthaft wollen, legen Sie die keep-alive-Intervall um die 25ms. Das ist eine völlig unsinnigen Wert. Der Standard-Wert ist zwei Stunden, und es gibt keinen Punkt in der Einstellung, niedriger als einige Minuten. Ähnlich der keep alive-Zeit eingestellt werden sollte, um eine halbe Stunde oder so, sicherlich nicht eine halbe Sekunde.
Der Standard Intervall zwischen keep-alive Sonden ist 2 Stunden. Diese ist beauftragt, in den RFC. Ein Intervall von einer Sekunde oder weniger ist verrückt, LAN oder kein LAN. Wenn Sie tun, Recht gut, was genau ist das problem?
InformationsquelleAutor user207421