2 votes

Comment utiliser setsockopt et getsockopt avec KEEP_ALIVE dans la programmation linux c pour déterminer une connexion tcp/ip interrompue ?

Comment utiliser setsockopt et getsockopt dans la programmation linux c pour déterminer une connexion tcp/ip interrompue ?

5voto

jxh Points 32720

A partir de la Page de manuel TCP :

Pour définir ou obtenir une option de socket TCP, appelez getsockopt(2) lire ou setsockopt(2) pour écrire l'option avec l'argument du niveau de l'option fixé à IPPROTO_TCP .

Voici les options possibles :

TCP_KEEPCNT (depuis Linux 2.4)

Nombre maximal de sondes keepalive que TCP doit envoyer avant d'abandonner la connexion. Cette option ne doit pas être utilisée dans un code destiné à être portable.

TCP_KEEPIDLE (depuis Linux 2.4)

Le temps (en secondes) dont la connexion a besoin pour rester inactive avant que TCP ne commence à envoyer des sondes keepalive, si l'option de socket SO_KEEPALIVE a été définie sur cette socket. Cette option ne doit pas être utilisée dans un code destiné à être portable.

TCP_KEEPINTVL (depuis Linux 2.4)

Le temps (en secondes) entre les sondes keepalive individuelles. Cette option ne doit pas être utilisée dans un code destiné à être portable.

Exemple :

int keepcnt = 5;
int keepidle = 30;
int keepintvl = 120;

setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(int));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(int));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(int));

3voto

lulyon Points 2335

L'utilisation de l'option de socket SO_KEEPALIVE peut être utile. Code de l'APUE :

int keepalive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive , sizeof(keepalive ));

Et de faire référence à ceci : Détection d'une rupture d'emboîture

1voto

Alt Eisen Points 400

Comme l'ont répondu @luly et @jxh, vous devez tout d'abord activer le keep-alive en paramétrant SO_KEEPALIVE. Ensuite, contrôlez le intervalle du rythme cardiaque normal en utilisant TCP_KEEPIDLE, intervalle des battements de cœur anormaux (non reconnus) en utilisant TCP_KEEPINTVL, et seuil de battements cardiaques anormaux en utilisant TCP_KEEPCNT.

Pour détecter une rupture de connexion, ces options doivent être définies à partir de l'onglet côté serveur .

Une explication détaillée est disponible à l'adresse suivante ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X