Socket C UNIX

k3v1n -  
 k3v1n -
Bonsoir,

J'ai un souci avec une appli en C utilisant les sockets et les pthreads.

C'est en gros un serveur de chat, je crée un nouveau pthread à chaque nouvelle connexion.

Ca m'arrive d'avoir des plantages type Segmentation fault, et j'aimerais pouvoir fermer les sockets une fois l'appli fermée.

Pour résumer : mon appli ouvre des sockets, plante, et les laisse ouverts.

Que faire ? Y'a des commandes UNIX pour fermer les sockets (qui sont présents quand je fais un netstat) ? Y'a mieux que rebooter la machine lol ?

Merci d'avance ;)

3 réponses

ange
 
Bonsoir.

Bien sur, tout processus dispose d'un id(soit pid), et il est possible de le tuer en trouvant le nom de ton processus fantôme.

ps aux | grep -i "ton_serveur"

ps affiche la liste des processus, et "aux" sont ses arguments.
| est un pipe qui envoie les résultat à la commande suivante
grep -i "ton_serveur" va matcher/garder les ligne qui contiennent "ton_serveur" sans respecter la casse.

Au final soit tu as la ligne direct de ton processus avec son pid, que tu peux tuer :
kill "pid trouvé"

Sinon tu peux le tuer avec son nom directement :
killall "ton_serveur"

Au pire tu le tue grâce au chemin de ton binaire :
fuser -k /chemin/vers/serveur

Tu peux afficher la liste des connections actives grâce à netstat, ca te permettra de voir si il y a encore des connections.
netstat -antu
(paquets tcp et udp affichés)

Je te laisse le soin de rechercher à quoi correspondre précisemment ces commandes, et de trouver un petit guide de survie sous linux.

Finalement je dirais que ton application est mal concu, vérifie le multithread, essayes de mettre en place des exceptions handling, et debug le au pire, gdb, ptrace, objdump...

Bye.
0
k3v1n
 
Merci de te pencher sur le problème.
Je maîtrise les grep/ps/kill et autres, ce n'est pas le souci, je cherche simplement une manière de virer les sockets qui sont encore ouverts alors que l'appli ne tourne plus (vérifié avec un ps ux).
Comme tu le dis, le problème vient de la conception de mon appli, j'ai pas beaucoup de temps et du coup je fais un peu n'importe quoi.
Aurais tu des tutos à me recommander sur l'utilisation de gdb ou ptrace par exemple stp ? Pour l'instant le debug se limite à des printf, c'est un peu lourd :/

Merci d'avance :)
0
ange
 
Les applications sont obligatoirement visible.
Je ne sais pas si tu as forker ou juste créer des processus fils, dans le second cas les connections seraient effacés.
Es-tu sur que les connections ne sont pas en "TIME_WAIT"|"CLOSING" ?

Dans tous les cas, tes processus doivent être obligatoirement visible, ils ne peuvent pas disparaitre(la seule manière est de hooker les syscall, rôle des rookits au travers de lkm, ce dont je doute fort ici).
pstree peut t'aider.

GDB : http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html
PTRACE : https://www.google.fr/search?hl=fr&q=ptrace&gws_rd=ssl

Bonne chance ;)
0
k3v1n
 
Les sockets sont sensés être fermés à l'intérieur des pthreads.
J'ai le souvenir d'en avoir vu en FIN_WAIT2, je n'ai pas retenu les autres statuts.
"la seule manière est de hooker les syscall, rôle des rookits au travers de lkm" < je n'ai absolument pas compris, donc je fais sûrement pas :D
Merci pour les liens et pour ton aide, je vais voir ce que donne le debug en C, merci :)
0