[gull] socket en C

Marc Mongenet marc at mongenet.ch
Wed May 14 16:42:32 CEST 2008


Le 14 mai 2008 15:32, Yann Sagon <ypublic at hasa.ch> a écrit :
> Bonjour,
>
> Je suis en train d'utiliser des socket (af_inet, sock_stream) en C et j'ai
> quelques questions:
>
> comment détecter la perte de connexion d'un client? Dans mon cas, je suis en
> attente sur un "select" en surveillant un set "readfds". Normalement, le
> client quite en envoyant une commande, mais dans le cas d'une déconnexion
> brutale, comment terminer proprement? Faut-il voir du côté d'un timeout?

Tant qu'on n'utilise pas la connexion, on ne le détecte pas.

Dans le livre "UNIX(R) Network Programming Volume 1, Third Edition: The Sockets
Networking API" il y a un chapitre consacré au crash du serveur, mais je ne vois
rien pour le crash d'un client. Je suppose que conceptuellement, le serveur n'a
pas à s'occuper de l'état du client. Le timeout me semble effectivement être
un moyen le plus propre : c'est-à-dire que conceptuellement, le serveur sert un
certain temps et pas plus.

Une autre solution est d'utiliser l'option SO_KEEPALIVE, qui vérifie l'état de
la connexion toutes les deux heures selon le livre. Mais le livre conseille
plutôt d'utiliser un timeout dans l'application car SO_KEEPALIVE manque
de flexibilité.

> J'ai également le problème suivant: si un client tente de se connecter sur
> ma socket et que j'ai atteint le nombre maximale de client, j'aimerais
> notifier le client. Y a t'il un moyen sans faire de "accept" préalablement?
> Et également, comment refuser ce client?

Pas à ma connaissance. Mais si tu veux notifier le client, logiquement il
faut bien commencer par accepter la connexion, non ?

-- 
Marc Mongenet
Creator of the Web 2 Markup Language
http://w2ml.com



More information about the gull mailing list