# \[résolu\] Socket et process

**URL:** <https://www.debian-fr.org/t/resolu-socket-et-process/3157>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 12:37 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157 "2016-02-20T12:37:12Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:37 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/1 "2016-02-20T12:37:12Z")

</div>

Alors, j’ai mis en place le socket entre le client et le serveur, mais ça bloque le programme. Comment faire en sorte que le socket tourne en arrière plan de façon à ce que l’utilisateur puisse continuer à utiliser l’application ?? (Problème classique des sockets j’imagine)

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:37 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/2 "2016-02-20T12:37:12Z")

</div>

Euh, si tu parles de shell, tu peux balancer une commande en tache de fond avec &  
Si tu veux que l’execution soit immortelle: nohup   
Mais ça m’etonne que tu ne connaisses pas ça, dc ca ne doit pas être ce que tu cherches.

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:37 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/3 "2016-02-20T12:37:13Z")

</div>

La solution est d’utiliser les threads pour tes sockets mais comme je ne sais pas dans quel langage tu programme difficile de te donner des bons liens correspondant. En voici quand meme quelques un pour le C et pour Java 🙂

[mapage.noos.fr/emdel/pthreads.htm](http://mapage.noos.fr/emdel/pthreads.htm)  
[java.sun.com/j2se/1.4.2/docs/api … hread.html](http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html)  
[www-gtr.iutv.univ-paris13.fr/Cou … hread.html](http://www-gtr.iutv.univ-paris13.fr/Cours/Mat/Systeme/CoursJavaThread.html)

---

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:37 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/4 "2016-02-20T12:37:13Z")

</div>

C’est en C (C C bien). En fait, avec la fonction socket, le serveur, comme le client, bloque sur la connexion. Je veux dire, le programme établi la connexion, et se focalise uniquement dessus. Impossible de quitter le programme par exemple. Les threads… ouaip, je pensais pouvoir les éviter. Merci Ash pour les liens. J’m’en vais les visiter.

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/5 "2016-02-20T12:46:24Z")

</div>

La solution, ce n’est certainement pas les threads.

La solution, c’est d’utiliser select ou poll, et peut être d’utiliser des socket non bloquantes.  
A+

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/6 "2016-02-20T12:46:24Z")

</div>

[quote=“ed”]La solution, ce n’est certainement pas les threads.

La solution, c’est d’utiliser select ou poll, et peut être d’utiliser des socket non bloquantes.  
A+[/quote]IL est gentil.  
TU pourrais être un peu moins laconique: même moi ( 😆 ) je ne sais pas ce que sont select et poll, et trouver des infos dans un moteur avec ces mots clés là 😉 …  
Quand au sockets non bloquantes, si quelqu’un ici avait la moindre idée de comment le faire, on l’aurait indiqué à Damsss…

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/7 "2016-02-20T12:46:24Z")

</div>

Bon, la piste des sockets non bloquantes est immédiatement exploitable:  
[gnosis.cx/publish/programming/sockets.html](http://gnosis.cx/publish/programming/sockets.html)

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/8 "2016-02-20T12:46:24Z")

</div>

En voyant le message d’ed, j’ai repris quelques recherches sur select et poll. voir [laissus.fr/cours/node17.html](http://www.laissus.fr/cours/node17.html)  
et plus précisement  
[laissus.fr/cours/node20.html … 0000000000](http://www.laissus.fr/cours/node20.html#SECTION06325000000000000000)  
[laissus.fr/cours/node20.html … 0000000000](http://www.laissus.fr/cours/node20.html#SECTION06326000000000000000)

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/9 "2016-02-20T12:46:25Z")

</div>

Mon gode (comme dise les aut’), on a reveillé un chercheur qui reprend ses recherches.  
Ash: je ne te savais pas cette qualité.

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/10 "2016-02-20T12:46:25Z")

</div>

[quote=“MattOTop”][quote=“ed”]La solution, ce n’est certainement pas les threads.

La solution, c’est d’utiliser select ou poll, et peut être d’utiliser des socket non bloquantes.  
A+[/quote]IL est gentil.  
TU pourrais être un peu moins laconique: même moi ( 😆 ) je ne sais pas ce que sont select et poll, et trouver des infos dans un moteur avec ces mots clés là 😉 …  
Quand au sockets non bloquantes, si quelqu’un ici avait la moindre idée de comment le faire, on l’aurait indiqué à Damsss…[/quote]

Faut pas pousser les mecs, merde, on fais du C ou quoi la ?

man 2 socket  
man 7 socket

```auto
       On peut faire des entrées-sorties non-bloquantes sur les sockets en
       fixant l'attribut O_NONBLOCK sur le descripteur de la socket avec
       fcntl(2). Ensuite toutes les opérations qui devraient normalement blo-
       quer se terminent immédiatement avec l'erreur EAGAIN (l'opération devra
       être retentée ultérieurement). connect(2) renverra l'erreur EIN-
       PROGRESS. L'utilisateur peut alors attendre divers événements avec
       poll(2) ou select(2).
```

Faudrais peut être aprendre a se servir de la documentation …

Quant a poll ou select

man 2 poll  
man 2 select

A+

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/11 "2016-02-20T12:46:25Z")

</div>

ed: 😊  
Et dire que je suis le premier à rappeler que l’essentiel de la doc systême en C est dans le man…

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/12 "2016-02-20T12:46:25Z")

</div>

😛

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/13 "2016-02-20T12:46:26Z")

</div>

[quote=“MattOTop”]Mon gode (comme dise les aut’), on a reveillé un chercheur qui reprend ses recherches.  
Ash: je ne te savais pas cette qualité.[/quote]Ben en fait ed a soulevé un point que je ne connaissais pas et comme je n’aime pas ne pas savoir 😃

---

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/14 "2016-02-20T12:46:40Z")

</div>

Merci, c’est sympa. Mais j’ai une erreur de segmentation lorsque le serveur udp veut faire la connexion.  
Extrait de code :

```auto
//connexion udp serveur 

 if ((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0) {
                        printf ("impossible d'ouvrir le socket\n");exit(1);
                }

        // bzero((char*) &serv_addr, sizeof(serv_addr));
                serv_addr.sin_family = PF_INET;
                serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
                serv_addr.sin_port = htons(3888);
          
               if ((bind(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)))<0){
                        printf ("impossible de faire le bind\n");exit(1);
                }

                /* écoute sur le port du socket */
                listen(sock,5);
[...]
```

Ca plante à l’amorçage, avant même le premier printf.  
L’erreur est :

```auto

```

C’est tout ce que renvoie la console. Et le programme quitte. 😕  
C’est comme si il n’arrivait pas à choper le port UDP.  
Dans le fichier d’entête :  
int sock;  
struct sockaddr\_in cli\_addr,serv\_addr;

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/15 "2016-02-20T12:46:40Z")

</div>

tu as mis un ulimit convenable pour génèrer un core et l’analyser avec un debugger ? Ou même, tu as essayé de tracer ton pgm pas à pas ?

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/16 "2016-02-20T12:46:40Z")

</div>

Essaye en remplaçant IPPROTO\_UDP par 0 pour voir…

Mais une erreur de segmentation signifie plutôt que la douille est bien crée mais que serv\_addr n’a pas été alloué. D’où le segfault… La structure a bien été créee (j’imagine que tu as vérifié)…

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/17 "2016-02-20T12:46:41Z")

</div>

Bon ben ok, aparament, vous avez jamais fais de C !!

Bon, commençons par le début:

apt-get install gdb valgrind

compilation de votre programme avec les symboles de debug:

gcc -ggdb programme.c -o programme

Lancement de gdb:

gdb ./programme

> r [arguments si il en existe]

le programme se lance. Paf segfault.

> backtrace

Collez nous le backtrace, ainsi que le source _COMPLET_ et a cette UNIQUE condition, nous seront en mesure de t’aider.

---

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/18 "2016-02-20T12:46:43Z")

</div>

Avec le debugger, j’ai trouvé l’erreur, merci Ed. En fait, ça venait du strlen, qui ne pouvait pas trouver la taille du buffer, puisque celui-ci était un pointeur. Je l’ai changé en char[MAXCHAR], et ça passe.

Du coup, je pense qu’en continuant à debugger, ça devrait aller à present. Pour le code source entier, je ne peux pas le mettre pour l’instant, ce ne serait pas trés fair-play vis-à-vis de mes camarades de classe (projet noté).

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/19 "2016-02-20T12:46:43Z")

</div>

Envoi le en mp je suis interressé 🙂

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:46 UTC](https://www.debian-fr.org/t/resolu-socket-et-process/3157/20 "2016-02-20T12:46:48Z")

</div>

[quote=“Damsss”]Avec le debugger, j’ai trouvé l’erreur, merci Ed. En fait, ça venait du strlen, qui ne pouvait pas trouver la taille du buffer, puisque celui-ci était un pointeur. Je l’ai changé en char[MAXCHAR], et ça passe.

Du coup, je pense qu’en continuant à debugger, ça devrait aller à present. Pour le code source entier, je ne peux pas le mettre pour l’instant, ce ne serait pas trés fair-play vis-à-vis de mes camarades de classe (projet noté).[/quote]

tu aurais pu faire un `
mystring = malloc(MAXCHAR+1);
memset(mystring, 0, MAXCHAR+1);
`

Puis un free bien placé 🙂

Mais ce n’étais qu’une autre façon de faire… Bravo pour la remarque a propos de tes camarades, je comprends mieux pourquoi j’avais pas le source 🙂

Bon courage pour la suite,

[Page suivante](https://www.debian-fr.org/t/resolu-socket-et-process/3157.md?page=2)
