Comment définir Keepalive sur Windows Server 2008
J'ai win32 application dans laquelle winsock est utilisé pour la communication TCP/IP.
Je suis en train de keepalive valeur avec WSAIoctl fonction et c'est de travail normalement avec windows XP.
Mais sur Win. Server 2008 WSAIoctl échoue, et WSAGetLastError retourne 10022(arguments non valides) qui n'a aucun sens.
Mon code qui définit keepalive est suit;
//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:
J'ai trouvé la solution, peut-être que ça peut aider quelqu'un d'autre qui sont confrontés à un même problème. Je tente de mettre keepalive juste après la async. appel de connexion, mais maintenant, je suis en train d'après l'achèvement de l'appel de connexion et cela a résolu le problème.
De http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx
Sur Windows Vista et les versions ultérieures, l'
SO_KEEPALIVE option de socket ne peut être
défini à l'aide de la fonction setsockopt quand
le socket est dans un état
pas un état transitoire. Pour TCP, les
SO_KEEPALIVE option de socket doit être
soit avant la fonction de connexion
(se connecter, ConnectEx, WSAConnect
WSAConnectByList, ou WSAConnectByName)
est appelé, ou après la connexion
la demande est réellement terminé. Si l'
fonction de connexion a été appelé
en mode asynchrone, cela nécessite
d'attente pour la connexion d'achèvement
avant d'essayer de définir la SO_KEEPALIVE
option de socket. Si une application
les tentatives de définir la SO_KEEPALIVE
option de socket lorsqu'une connexion
la demande est encore en cours, les
fonction setsockopt échoue et
retour WSAEINVAL.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la solution, peut-être que ça peut aider quelqu'un d'autre qui sont confrontés à un même problème.
Je tente de mettre keepalive juste après la async. appel de connexion, mais maintenant, je suis en train d'après l'achèvement de l'appel de connexion et cela a résolu le problème.
À partir de http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx
Probablement le noyau s'oppose à votre choix de valeurs. Je le ferais. Vous ne pouvez pas vous voulez sérieusement à définir le keep-alive intervalle de 25ms. C'est complètement fou de la valeur. La valeur par défaut est de deux heures, et il n'y a pas de point de réglage inférieur à celui de plusieurs minutes. De même, les paramètres doivent être définis pour une demi-heure, certainement pas une demi-seconde.