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

Schreibe einen Kommentar