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 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