[gull] socket en C

Yann Sagon ypublic at hasa.ch
Thu May 15 10:21:27 CEST 2008


Leopoldo Ghielmetti a écrit :
> Il giorno mer, 14/05/2008 alle 16.42 +0200, Marc Mongenet ha scritto:
>   
>> 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.
>>     
> Ce que moi j'ai fait dans une application que j'avais développé il y a 8
> ans c'est d'envoyer un ping applicatif vers le client. Si la connexion
> tombe, on le détecte au ping suivant. Si la connexion reste active mais
> le client est mort, on le détecte car il ne répond pas.
> Ceci implique que le client doit gérer un ping!
>
>   
Ca me semble une solution envisageable pour mon cas.
>>> 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 ?
>>     
>
> Exact. Il faut faire un accept et traiter la connexion. La boucle qui
> fait les accept doit toujours tourner, simplement si le nombre maximum
> de connexion autorisées est atteint, la boucle peut envoyer un message
> et déconnecter juste après.
> Regarde aussi du côté du nombre de client en attente sur le socket (je
> ne me rappelle plus comment s'appelle le paramètre, mais ça à a voir
> avec un paramètre listener ou qqc. comme ça), 
dans listen tu peux spécifier le "backlog" soit les clients en attente, 
je pense que c'est de ça que tu parles? C'est 5 normalement.
>
> Fais aussi très attention aux paquets "fragmentes" lors-ce que tu traite
> tes read/write sur le socket, ne fais jamais de suppositions sur les
> données envoyés ou reçues, même si c'est ton code qui les envoie, il est
> toujours possible que tu fais un write("toto\n") et que de l'autre côté
> tu reçois un "to" et une seconde après "to\n", ou que tu fais
> write("toto\n"); sleep(1000);write("titi\n") et que tu reçois "toto
> \ntiti\n" en un seul coup.
>   
C'est une application qui sera utilisée sur un réseau local, il n'y aura 
(en principe) jamais de fragrmentation.
Mais effectivement, vaut mieux prévoir..



More information about the gull mailing list