Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sockets en C++

55 réponses
Avatar
Merwin
Bonjour à tous,

Je suis étudiant en DUT Informatique, et je programme un peu en dehors
des cours pour m'entrainer, voici donc quelques questions.

1) J'aimerais faire une petite application qui se connecte à un serveur
IRC, donc via des sockets TCP. Seulement je me heurte à quelques problèmes:

- Y a t'il des bibliothèques portables qui me permettent de gérer plus
facilement les sockets? L'idée c'est que le code sois facilement
compilable d'une platforme à une autre.

Je sais que c'est possible avec Qt par exemple, mais ça me parait un peu
lourd, puisque si je commence à utiliser Qt, je vais utiliser tous
l'arsenal qui va avec (QSring, QList etc...), et je souhaiterais
utiliser un maximum la STL.

- Comment gérer le "main loop", je ne sais pas trop comment ça
fonctionne, car si je ne fais pas une boucle infinie (while true?) mon
programme arrete de s'éxécuter (normal me direz-vous...).

Alors comment puis-je empecher mon programme de s'arreter? Je cherche la
manière la plus propre possible. Encore une fois Qt permet ça facilement
puisque de base il y a un "event loop" qui gère ça, mais j'aimerais peut
voir d'autres méthodes.

2) Comment puis-je placer mon application en "fond", c'est à dire
qu'elle rende la main une fois qu'elle a été démarée. Idem, je cherche
une solution portable !

Merci d'avance pour votre aide,

Thibaut

10 réponses

1 2 3 4 5
Avatar
pjb
Merwin writes:

Bonjour à tous,

Je suis étudiant en DUT Informatique, et je programme un peu en dehors
des cours pour m'entrainer, voici donc quelques questions.

1) J'aimerais faire une petite application qui se connecte à un
serveur IRC, donc via des sockets TCP. Seulement je me heurte à
quelques problèmes:

- Y a t'il des bibliothèques portables qui me permettent de gérer plus
facilement les sockets? L'idée c'est que le code sois facilement
compilable d'une platforme à une autre.

Je sais que c'est possible avec Qt par exemple, mais ça me parait un
peu lourd, puisque si je commence à utiliser Qt, je vais utiliser tous
l'arsenal qui va avec (QSring, QList etc...), et je souhaiterais
utiliser un maximum la STL.



Dans la STL, il n'y a aucune classe pour gérer les sockets.
Mais tu pourras facilement encapsuler l'API sockets dans des classes
compatible avec la STL.


- Comment gérer le "main loop", je ne sais pas trop comment ça
fonctionne, car si je ne fais pas une boucle infinie (while true?) mon
programme arrete de s'éxécuter (normal me direz-vous...).

Alors comment puis-je empecher mon programme de s'arreter? Je cherche
la manière la plus propre possible. Encore une fois Qt permet ça
facilement puisque de base il y a un "event loop" qui gère ça, mais
j'aimerais peut voir d'autres méthodes.



Si ton programme a des threads, tu peux ne pas avoir une boucle
d'évènement, mais juste une boucle infinie. Il serait sage alors de
juste dormir:

while(1) sleep(100000);


Mais sinon il faudra bien implémenter une boucle d'évènement. Par
exemple, tu voudras surement utiliser select(2) ou poll(2).


2) Comment puis-je placer mon application en "fond", c'est à dire
qu'elle rende la main une fois qu'elle a été démarée. Idem, je cherche
une solution portable !



Une application ne se met pas en tâche de fond normalement.
Un démon peut-être, mais pas une application.
Chercher sur google: daemonize

--
__Pascal Bourguignon__
Avatar
Fabien LE LEZ
On Thu, 12 Mar 2009 17:51:18 +0100, Merwin :

- Y a t'il des bibliothèques portables qui me permettent de gérer plus
facilement les sockets?



Si tu cherches une bibliothèque, la première étape consiste à aller
voir chez Boost. En l'occurence :
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio.html

- Comment gérer le "main loop", je ne sais pas trop comment ça
fonctionne, car si je ne fais pas une boucle infinie (while true?) mon
programme arrete de s'éxécuter (normal me direz-vous...).



Que cherches-tu à faire exactement ?
Et quand est-ce que l'application doit se terminer ?

Si tu as une seule connexion TCP à gérer, le plus simple est de faire
une boucle sur un appel bloquant.

Cf aussi les exemples fournis sur la page ci-dessus.

2) Comment puis-je placer mon application en "fond", c'est à dire
qu'elle rende la main une fois qu'elle a été démarée.



Sous Linux, pour lancer une application et reprendre la main sur la
ligne de commande, il suffit d'ajouter un "&" à la fin de la commande.

Sur tous les OS, tu peux tout simplement ouvrir une fenêtre dédiée, et
lancer l'application là-dedans. Si tu n'es pas en GUI, l'utilitaire
"screen" est ton ami.

Si tu veux que ton programme tourne en permanence, il faut créer un
démon dans /etc/init.d/ sous Linux (et l'activer avec chkconfig ou
l'équivalent dans ta distribution) ; sous Windows, il faut créer un
service (cf doc Microsoft).
Avatar
Fabien LE LEZ
On Thu, 12 Mar 2009 19:18:04 +0100, (Pascal J.
Bourguignon):

Si ton programme a des threads, tu peux ne pas avoir une boucle
d'évènement, mais juste une boucle infinie.



Utiliser des threads ici ne me paraît pas forcément la meilleure idée.
Mais même s'il utilise plusieurs threads, il y en aura bien un qui a
une boucle avec un "select" (ou équivalent).

Par ailleurs, Boost.Asio m'a l'air d'inclure la gestion d'une telle
boucle.

Une application ne se met pas en tâche de fond normalement.



Ça dépend de ce qu'on appelle "tâche de fond".

Sous MS-DOS, ça avait un sens : c'était un bout de code qui était
appelé par le système sous certaines conditions. Par exemple, le
driver de la souris ou du lecteur CD-ROM.

Sur un OS moderne (Windows, *nix), plusieurs processus tournent en
même temps. La notion de "tâche de fond" n'a donc plus guère de sens.
Le seul truc, c'est qu'un processus peut interagir avec une console
(texte ou graphique) ou non.
Avatar
espie
In article <49b93d83$0$12613$,
Merwin wrote:
Bonjour à tous,

Je suis étudiant en DUT Informatique, et je programme un peu en dehors
des cours pour m'entrainer, voici donc quelques questions.

1) J'aimerais faire une petite application qui se connecte à un serveur
IRC, donc via des sockets TCP. Seulement je me heurte à quelques problèmes:

- Y a t'il des bibliothèques portables qui me permettent de gérer plus
facilement les sockets? L'idée c'est que le code sois facilement
compilable d'une platforme à une autre.

Je sais que c'est possible avec Qt par exemple, mais ça me parait un peu
lourd, puisque si je commence à utiliser Qt, je vais utiliser tous
l'arsenal qui va avec (QSring, QList etc...), et je souhaiterais
utiliser un maximum la STL.



Non, pas forcement si lourd que ca, surtout qu'en Qt4 la bibliotheque
est decoupee en plusieurs morceaux relativement independants. De memoire,
ils ont aussi retouche quelques details pour que ca soit le plus possible
compatible avec la STL (en particulier niveau iterateurs).

Je sais qu'il y a aussi une bibliotheque ACE qui est parait-il pas mal pour
faire du reseau en C++, mais je ne m'en suis jamais servi.
Avatar
espie
In article <49b93d83$0$12613$,
Merwin wrote:
2) Comment puis-je placer mon application en "fond", c'est à dire
qu'elle rende la main une fois qu'elle a été démarée. Idem, je cherche
une solution portable !



Sous Unix, pour un serveur, le mot que tu cherches est "daemon", et il y a
quelques trucs a faire pour creer un daemon: fermer tous les fd initiaux
du programme et les rouvrir sur /dev/null, faire un cd a un endroit
raisonnable (histoire d'eviter les problemes de montage demontage NFS),
forker, et devenir chef de session (setsid) pour ne plus etre affecte
par ce qui arrive au pere (qu'on laisse sortir).
Avatar
espie
In article <49b95fee$0$12623$,
Merwin wrote:
Non, pas forcement si lourd que ca, surtout qu'en Qt4 la bibliotheque
est decoupee en plusieurs morceaux relativement independants. De memoire,
ils ont aussi retouche quelques details pour que ca soit le plus possible
compatible avec la STL (en particulier niveau iterateurs).

Je sais qu'il y a aussi une bibliotheque ACE qui est parait-il pas mal pour
faire du reseau en C++, mais je ne m'en suis jamais servi.



Le problème c'est surtout pour le déploiement de l'application, comment
pourrais la deployer facilement, les utilisateurs devraient posséder la
librairie Qt sous linux et je devrai leur fournir les DLL sous Windows ?



Ca, de toutes facons, quel que soit la bibliotheque que tu choisis,
tu auras le souci du deploiement, en particulier du cote windows.
Cote Unix, qt est dispo sur a peu pres toutes les distribs dans les
paquets standards.

(au fait, library c'est de l'anglais. Ca se traduit par bibliotheque
en francais, sachant que librairie, c'est bookstore ou bookshop ;) )
Avatar
Fabien LE LEZ
On Thu, 12 Mar 2009 20:46:25 +0000 (UTC), (Marc
Espie):

Cote Unix, qt est dispo sur a peu pres toutes les distribs dans les
paquets standards.



Mais quelle version de Qt ?

Si tu télécharges Qt aujourd'hui pour développer, tu prendras
probablement la version actuelle : 4.5.

Côté déploiement, Debian s'en sort pas trop mal, vu que Lenny vient de
passer en "stable" : ils ont la version 4.4.3.
Pas mal de machines sont encore en Etch, où seule la version 4.2.1 est
dispo.

Certes, tu peux "forcer" l'installation de Qt 4.5, mais elle a
probablement des dépendances non satisfaites, et le problème
recommence.

Et c'est pareil pour la plupart des bibliothèques. Et je n'ai parlé
ici que d'une seule distribution.

Sous Windows, c'est plus simple : tu distribues un .zip avec ton .exe
et les .dll qui vont bien, et basta. Tant que tu n'essaies pas de
mettre les DLL dans le répertoire Windows, pas de souci.

Il y a aussi la solution la plus fiable : compiler tout en static.
Avatar
espie
In article ,
Fabien LE LEZ wrote:
On Thu, 12 Mar 2009 20:46:25 +0000 (UTC), (Marc
Espie):

Cote Unix, qt est dispo sur a peu pres toutes les distribs dans les
paquets standards.



Mais quelle version de Qt ?

Si tu télécharges Qt aujourd'hui pour développer, tu prendras
probablement la version actuelle : 4.5.



Ou est le souci ? Il y a une bonne compatibilite ascendante entre les
versions de qt depuis la 4. Que tu aies une 4.3 ou une 4.5, si tu n'utilises
rien de specifique a 4.5, ca marche pareil, et sauf si les packagers ont
fait des betises, ca va etre compatible au niveau binaire...
Avatar
Merwin
Marc Espie a écrit :
In article <49b93d83$0$12613$,
Merwin wrote:
2) Comment puis-je placer mon application en "fond", c'est à dire
qu'elle rende la main une fois qu'elle a été démarée. Idem, je cherche
une solution portable !



Sous Unix, pour un serveur, le mot que tu cherches est "daemon", et il y a
quelques trucs a faire pour creer un daemon: fermer tous les fd initiaux
du programme et les rouvrir sur /dev/null, faire un cd a un endroit
raisonnable (histoire d'eviter les problemes de montage demontage NFS),
forker, et devenir chef de session (setsid) pour ne plus etre affecte
par ce qui arrive au pere (qu'on laisse sortir).



Merci, donc en fait je dois fork() et exit() le père, en effet je n'y
avais pas pensé ! Merci ;-)
Avatar
Merwin
Marc Espie a écrit :
In article <49b93d83$0$12613$,
Merwin wrote:
Bonjour à tous,

Je suis étudiant en DUT Informatique, et je programme un peu en dehors
des cours pour m'entrainer, voici donc quelques questions.

1) J'aimerais faire une petite application qui se connecte à un serveur
IRC, donc via des sockets TCP. Seulement je me heurte à quelques problèmes:

- Y a t'il des bibliothèques portables qui me permettent de gérer plus
facilement les sockets? L'idée c'est que le code sois facilement
compilable d'une platforme à une autre.

Je sais que c'est possible avec Qt par exemple, mais ça me parait un peu
lourd, puisque si je commence à utiliser Qt, je vais utiliser tous
l'arsenal qui va avec (QSring, QList etc...), et je souhaiterais
utiliser un maximum la STL.



Non, pas forcement si lourd que ca, surtout qu'en Qt4 la bibliotheque
est decoupee en plusieurs morceaux relativement independants. De memoire,
ils ont aussi retouche quelques details pour que ca soit le plus possible
compatible avec la STL (en particulier niveau iterateurs).

Je sais qu'il y a aussi une bibliotheque ACE qui est parait-il pas mal pour
faire du reseau en C++, mais je ne m'en suis jamais servi.



Le problème c'est surtout pour le déploiement de l'application, comment
pourrais la deployer facilement, les utilisateurs devraient posséder la
librairie Qt sous linux et je devrai leur fournir les DLL sous Windows ?
1 2 3 4 5