Rechercher : dans
Par :

Socket C UNIX

Dernière réponse le 30 avr 2008 à 12:42:25 k3v1n, le 30 avr 2008 à 01:20:03 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Socket C UNIX » dans :
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
PC : les configurations de référence (unités centrales) VoirLes principes généraux sont décrits dans cet article. Ici seront décrits les choix les plus intéressants pour son Unité Centrale. Les différents éléments sont choisis en fonction de leur rapport performances/prix intéressant, ou pour une...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Télécharger Unison VoirUnison est un logiciel de synchronisation de répertoires. Il est capable de travailler de manière bidirectionnelle, c'est à dire que vous pouvez effectuer des modifications dans les deux répertoires, et Unison les synchronisation...
Télécharger Universal Document Converter VoirVoulez vous convertir vos images en fichier PDF ? Universal Document Converter est le logiciel idéal pour le faire. Comme son peut l’affirmer très bien, Universal Document Converter est un convertisseur PDF universelle c'est-à-dire qu’il...
Les fonctions de l'API Socket VoirLes fonctions des sockets en détail La fonction socket() La création d'un socket se fait grâce à la fonction socket() : int socket(famille,type,protocole) famille représente la famille de protocole utilisé (AF_INET pour TCP/IP utilisant une...
Programmation réseau - Les sockets VoirIntroduction aux sockets La notion de sockets a été introduite dans les distributions de Berkeley (un fameux système de type UNIX, dont beaucoup de distributions actuelles utilisent des morceaux de code), c'est la raison pour laquelle on parle...
Introduction au langage C VoirPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie...

1

ange, le 30 avr 2008 à 04:00:17

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.

Répondre à ange

2

k3v1n, le 30 avr 2008 à 04:32:06

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

Répondre à k3v1n

3

ange, le 30 avr 2008 à 04:44:31

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 : http://www.google.fr/search?hl=fr&q=ptrace

Bonne chance ;)

Répondre à ange

4

 k3v1n, le 30 avr 2008 à 12:42:25

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

Répondre à k3v1n