Configuration de TCP keepalive après l'accepter
Après la accept()
sur un socket, je suis en train de configurer le TCP keepalive.
SockConnected = accept(SockListen, &RemoteAddr,
&RemoteLen);
/* A bit of checking goes here */
if (setsockopt (SockConnected , SOL_SOCKET, SO_KEEPALIVE,
(ST_CHAR *) &sockopt_on, sizeof (int) ) )
{
/* Error logging */
}
if (setsockopt(SockConnected , IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(sockopt_tcp_keep_idle), sizeof(sockopt_tcp_keep_idle)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(sockopt_tcp_keep_intvl), sizeof(sockopt_tcp_keep_intvl)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(sockopt_tcp_keep_cnt), sizeof(sockopt_tcp_keep_cnt)))
{
/* Error logging */
}
Après l'appel de getsockopt()
pour tous les quatre propriétés, tout semble correct. J'ai vérifié dans Wireshark et il n'existe pas de Garder en vie les paquets envoyés. J'ai dû changer SOL_TCP
à IPPROTO_TCP
, car lors de l'appel de setsockopt()
pour TCP_KEEPIDLE
il était de retour errno 92 (Protocole non trouvé).
Je suis en train de faire la même chose après l'appel de socket()
pour une connexion sortante, et il fonctionne parfaitement.
Je suis à l'aide de C et Linux.
Est-il une raison pourquoi setsockopt
peut ne pas fonctionner après l'accepter?
Les valeurs de la configuration ne peut pas être les valeurs réelles utilisées. La plate-forme possible de les modifier. Utilisation
Je l'ai essayé sur la socket d'écoute trop, avec pas de chance. Je vais doubler vérifier les valeurs de retour de
getsockopt()
de savoir quelles valeurs sont effectivement utilisés, et de voir si ce qui se passe est d'accord avec ça. NB je crois que vous pouvez faire tout cela à la fois, sur la socket d'écoute, d'où il sera héritée par tous les sockets.Je l'ai essayé sur la socket d'écoute trop, avec pas de chance. Je vais doubler vérifier les valeurs de retour de
getsockopt()
. Merci!OriginalL'auteur Arapajoe | 2015-07-15
Vous devez vous connecter pour publier un commentaire.
Ici est un travail minimale exemple. Si cela fonctionne pour vous, vous pouvez l'utiliser comme une référence.
Exemple de sortie (
tcpdump
rapports persistantes paquets à chaque seconde):listen()
et après laaccept()
. Si je le fais juste aprèsaccept()
, keepalive il est activé.OriginalL'auteur gavv
SO_KEEPALIVE
doit être utilisé avecSOL_SOCKET
, pasIPPROTO_TCP
ouSOL_TCP
. Voir socket(7) et tcp(7).Donc, essayez ceci:
Je suppose que
TCP_KEEPIDLE
et des options similaires sont tout simplement ignorées siSO_KEEPALIVE
n'a pas été réglé correctement, etSOL_TCP
est synonyme deIPPROTO_TCP
.Si cela n'aide pas, pensez à publier un exemple minimal qui reproduit le problème.
SOL_SOCKET
est utilisé avecSO_KEEPALIVE
.Bien, alors je n'ai pas d'idées. Je suggère de commencer à partir de l'exemple minimal qui reproduit votre programme et d'en faire la vérification des erreurs pour tous les appels système, afin que d'autres puissent l'essayer et de vous aider. Je vais poster un exemple minimal qui fonctionne pour moi dans un moment.
faute de frappe: programme -> problème
OriginalL'auteur gavv