Les Allergies
Alimentaires
Posez votre question Signaler

[C] Programmation réseau et socket [Résolu]

jro-daemon 10Messages postés 13 février 2007Date d'inscription - Dernière réponse le 11 janv. 2008 à 11:33
Bonjour,
je suis actuellement en train de m'attaquer à l'apprentissage de l'utilisation de socket. Je travaille sous Ubuntu Edgy. J'ai deja fait le test de faire communiquer un client et un serveur en utilisant la boucle locale. Ma question est de savoir s'il est possible que je fasse tourner un client et un serveur dans un même programme en utilisant les descripteurs de fichiers.
Mon idée est la suivante:
Tout d'abord je crée un set de descripteur de fichiers avec:
fd_set master
int fd_max

Puis dans le fichier principal, je taperais un truc de ce genre:
#define PORT_CLIENT 5060
#define PORT_SERVER 7000

int client_fd;
int server_fd;
fd_set read_fds;
struct timeval tv;
/*
J'utilise ici la structure timeval pour fixer un timeout à 10 ms
*/
tv.tv_sec = 0;
tv.tv_usec = 10;

FD_ZERO(&master);
FD_ZERO(&read_fds);
/*
J'initialise ici un descripteur de fichier pour le serveur et le client. Les procédures client_start() et server_start() retournent ce socket.
*/
client_fd = client_start(PORT_CLIENT); 
server_fd = server_start(PORT_SERVER);

FD_SET(client_fd,&master);
FD_SET(server_fd,&master);
FD_SET(0,&master);

/*...*/

/*Boucle principale*/
while(1)
{
 read_fds = master;
 if (pselect(fdmax+1,&read_fds,NULL,NULL,&tv,NULL) <0)
 /*controle d'erreur*/
 if (FD_ISSET(0,&read_fds)) // On lit quelque chose dans le descripteur de fichier de stdin
{
/*Action a entreprendre en conséquence*/
}
if(FD_ISSET(client_fd,&read_fds))
{
 /*Le client a reçu quelque chose provenant du serveur, il répond en conséquence*/
}
if (FD_ISSET(server_fd,&read_fds))
{
/*Le serveur reçoit un message provenant du client, il réagit en conséquence en traitant le message dans la partie application*/
}
}

Lire l'entrée de stdin permet de sortir de la boucle infinie. Est-ce que l'idée pourrait marcher?
Johnny
Lire la suite 

[C] Programmation réseau et socket »

13 réponses
Réponse
+1
moins plus
Bonjour,
l'idée serait donc de le faire avec des threads. C'est-à-dire qu'il y aurait un thread pour le client et en pour le serveur. As-tu par hasard un lien sur les applications multi-thread histoire que je voie comment ça marche. Peux-tu me donner un exemple concret d'utilisation pour que je pige bien la mise en pratique?
Merci pour l'idée. Je vais continuer à réfléchir dans ce sens.
Johnny
Ajouter un commentaire
Réponse
+0
moins plus
Salut.
Je n'ai pas compris ce que tu voulais faire.
Mais je ne voi aucun problème à avoir un programme qui fait à la foi client et serveur. En fait, c'est une espèce de logiciel routeur.
Moi, j'ai fait un programme qui fait plusieurs clients.
par contre, je gèrerai ça en thread plutôt qu'en while if.
Ajouter un commentaire
Réponse
+0
moins plus
regarde ça :
http://khayyam.developpez.com/articles/cpp/multithreads/
je pense que ça correspond bien
Char SnipeurStupeflip - 16 févr. 2007 à 15:54
NOTE : pthread existe aussi sous windows
StupeflipStupeflip - 16 févr. 2007 à 16:04
Oui mais ce n'est qu'une adaptation de la norme POSIX qui est fait pour Linux et d'ailleurs c'est mal adapté à mon gout (je précise :p) car ayant voulu mettre des thread sous windows en utilisant pthread j'ai eu une désagréable surprise (et oui Visual C++ encore une fois).

Heureusement l'auteur du post est sous Linux donc tout va bien pour lui ;)
jro-daemonStupeflip - 17 févr. 2007 à 01:03
Salut,
en effet, je suis bien sous linux lorsque je fais de la programmation et en général je me suis bien habitué à travailler sur la récente version d'Ubuntu. Et puis, sous Windows, j'ai jamais vraiment fait de la prog sauf une fois lorsque j'avais à programmer une puce donc c'était mieux de le faire sous Windows. Sinon, j'aime pas trop les interfaces et j'ai pas cherché s'il y avait des IDE intéressantes sous Windows: peut être Visual C++, mais l'ayant utilisé quelquefois, je le trouve pas à mon goût.
Bonne nuit,
Johnny D.
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,


j'ai écrit un tutoriel qui explique comment utiliser les fonctions sockets, aussi bien sous Linux que sous Windows :

http://www.quantic-storm.com/qs/index.php?menu=Community&sm0=Sockets&language=FR

Tout le code est téléchargeable, ainsi qu'un exemple de client-serveur. Celui-ci utilise bien des threads (un par client ou par serveur) et le tout troune dans la même application. Le code se compile aussi bien sous Windows que sous Linux (testé avec Ubuntu).
jro-daemon- 24 févr. 2007 à 19:08
Oui, merci pour ton information. La librairie est une API utilisable pour n'importe quel type d'application, n'est-ce-pas? Je pense que je pourrais m'en servir pour développer une application fonctionnant avec le protocole SIP.
Cordialement,
Johnny
Ajouter un commentaire
Réponse
+0
moins plus
slt
je cherche de la doc sur winsock
je debute en programmation socket
Ajouter un commentaire
Ce document intitulé « [C] Programmation réseau et socket » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?