[socket] echange de messages entre client et serveur....

echange de messages entre client et serveur.... [socket] - C - Programmation

Marsh Posté le 02-10-2006 à 18:43:21    

Salut,  
J'ai fait un petit exemple de client/serveur (avec Winsock2 sous Windows) qui permet d'échangé des messages entre le client et le serveur.  
 
Simplement voilà:  
Le client ne peut envoyer un message au serveur que si le serveur a répondu au msg du client , et c'est idem pour le serveur . Càd : qu'il échange des message à tour de rôle.  
 
Et je me demande ci en peut faire en sorte que le client et le serveur peuvent envoyé des msg tout les 2 , càd en même temps .  
J’ai essayé mais je n'arrive pas à le faire . Il faut toujours attendre la réponse du client pour que le serveur puisse envoyé , et ainsi de suit ....  
Est-ce qu'on peut le faire...  
 
merci pour votre aide.  
 
ps: si vous voulez voire le code actuel demender .


Message édité par big_dadi_fat le 20-10-2006 à 16:44:02
Reply

Marsh Posté le 02-10-2006 à 18:43:21   

Reply

Marsh Posté le 04-10-2006 à 16:03:14    

Salut  :hello:  
 
J'imagine que ton problème est plutôt : comment avoir un programme qui puisse à la fois envoyer et recevoir  
 
Y a 3 grands principes :  
 
--------------------------------------
 
1)
rendre les lectures non bloquantes. Le programme tente une lecture mais ne reste pas bloqué à attendre des données. S'il n'y a rien à lire, eh bien il ne lit rien. Pour celà, il faut paramétrer la socket en non bloquante avec la fonction fcntl(sockfd, F_SETFL, O_NONBLOCK);
Le problème avec les sockets non bloquantes, c'est que tu risques d'arriver très vite à un programme du genre :  
while (1) {  
  read(la_socket)  
}

qui boucle continuellement (une attente active, ca s'appelle  ). Bien sur, le programme peut se mettre en pause entre 2 tentatives mais il n'est pas forcément facile de trouver le bon compromis (temps trop court et le programme boucle souvent pour rien, trop long et il y a un délai important entre l'arrivée des données et leur traitement)  
Maintenant, c'est aussi une solution plutôt simple à programmer, ce qui n'est pas négligeable quand on connait pas trop le sujet (qui est loin d'être simple  )  
 
--------------------------------------
 
 
2)
regarder s'il y a quelque chose à lire avant de faire une lecture (c'est peut être là qu'intervient la fonction "select"  )  
La fonction select() permet de surveiller un ensemble de sockets. Par exemple, un serveur qui gère plusieurs connexions simultanées utilisera cette fonction. Il sera en attente (passive, donc pas de consommation de cpu) et la fonction lui indiquera la socket sur laquelle des données viennent d'arriver .
donc si tu veut avoir un système de communications asynchrone, donc +1 pour select() .
 
--------------------------------------
 
3)
Sinon, il reste aussi la possibilité de faire la réception dans un thread.
L'un peut rester bloqué en lecture, l'autre continue à s'exécuter pour envoyer des données , donc le thread peut rester bloqué en lecture sur la socket sans géner le traitement qui fait l'envoi (ou inversement) .
Mais je ne sais pas si sa pose pas de problème de lire et écrire depuis 2 threads sur une même socket .
 
 
Mentenant puisque tu programme sous Windows, il faut voire si le nom de fonctions comme fcntl() , select() etc.... sont les méme sous unix que sous window, et chérche sur Google etc...etc...
 
on espérant t'avoire aider
 
 
 
 
Bad_Day.
 :hello:  ;)

Message cité 1 fois
Message édité par Bad_Day le 04-10-2006 à 16:04:03
Reply

Marsh Posté le 04-10-2006 à 16:22:31    

Bad_Day a écrit :

J'imagine que ton problème est plutôt : comment avoir un programme qui puisse à la fois envoyer et recevoir  
 
Y a 3 grands principes :


 
Très joli les effets colorés...
 

Bad_Day a écrit :


1)
rendre les lectures non bloquantes. Le programme tente une lecture mais ne reste pas bloqué à attendre des données. S'il n'y a rien à lire, eh bien il ne lit rien. Pour celà, il faut paramétrer la socket en non bloquante avec la fonction fcntl(sockfd, F_SETFL, O_NONBLOCK);


 
Petit détail dans le cadre des lectures non bloquantes: si tu commences, en plus, à gérer les erreurs, il te faudra distinguer 2 cas :

  • je ne lis rien parce qu'il n'y a rien à lire
  • je ne lis rien parce que j'ai une erreur

Dans le premier cas, la variable "errno" (#include <errno.h> ) aura pour valeur "EAGAIN" alors que dans le second cas, elle aura pour valeur la cause de l'erreur...


Message édité par Sve@r le 04-10-2006 à 16:24:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-10-2006 à 16:32:32    

Super, merci pour votre aide Bad_Day et Sve@r , je croi que je vais utilisé la 1ére methode (les sockets non bloquante).
Si j'ai des probléme je avec les sockets non bloquante je reposteré,
Mais enfait, je ne sais pas comment les utilisé :(  (fcntl)...
 
 

Reply

Marsh Posté le 04-10-2006 à 16:36:32    

big_dadi_fat a écrit :

Mais enfait, je ne sais pas comment les utilisé :(  (fcntl)...


 
rtfm
 

Reply

Marsh Posté le 04-10-2006 à 21:06:04    


rtfm = Read The Fuck Manual => lit le man...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-10-2006 à 21:46:53    

Sve@r a écrit :

rtfm = Read The Fuck Manual => lit le man...


Fuck'n [:aloy]

Message cité 1 fois
Message édité par Emmanuel Delahaye le 04-10-2006 à 21:47:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-10-2006 à 10:49:47    

ok ok, je vais voir...
 

Reply

Marsh Posté le 06-10-2006 à 12:53:00    

C'est quoi l'equivalent de fcntl() sous windows, je ne trouve pas :(
 

Reply

Marsh Posté le 17-10-2006 à 14:12:19    


 
http://f0rked.com/flash/v=fuck
pour plus d'info sur la definition du mot...
 
 :lol:

Message cité 1 fois
Message édité par Bad_Day le 17-10-2006 à 14:12:51
Reply

Marsh Posté le 17-10-2006 à 14:12:19   

Reply

Marsh Posté le 17-10-2006 à 15:39:28    

Bad_Day a écrit :

http://f0rked.com/flash/v=fuck
pour plus d'info sur la definition du mot...
 
 :lol:


:fuck:


Message édité par Emmanuel Delahaye le 17-10-2006 à 15:42:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-10-2006 à 16:31:41    

euh  UP  :whistle:  

Reply

Marsh Posté le 20-10-2006 à 16:40:59    


Moi je croie qu'il faut que tu te sors un peut les doigts du cul est que tu cherche un peut sur google,
C'est vrai quoi ?
 

Reply

Marsh Posté le 20-10-2006 à 16:44:51    

Bad_Day a écrit :

Moi je croie qu'il faut que tu te sors un peut les doigts du cul est que tu cherche un peut sur google,
C'est vrai quoi ?


 
j'ai chérché mais je ne trouve pas !
 

Reply

Marsh Posté le 20-10-2006 à 17:53:14    

big_dadi_fat a écrit :

j'ai chérché mais je ne trouve pas !


 
Utilise la fonction ioctlsocket().

Code :
  1. int PASCAL FAR ioctlsocket ( SOCKET sock, long cmd, u_long FAR * argp );


 
 
 

Reply

Marsh Posté le 20-10-2006 à 18:04:20    

Voilà je t'aide.
Tu peut crée une fonction qui rend ta socket non bloquante,
par enxemple:

Code :
  1. int NonBloquante(SOCKET sd)
  2. {
  3.    u_long argp=1;
  4.    ioctlsocket(sd, FIONBIO, &argp);
  5.    if (argp==0)
  6.    {
  7.       fprintf(stderr, "socket non-bloquante, deuxième tentative\n" );
  8.       ioctlsocket(sd, FIONBIO, &argp);
  9.    }
  10.    if (argp==0)
  11.    {
  12.       fprintf(stderr, "n'arrive pas à créer une socket non-bloquante\n" );
  13.       return 0;
  14.    }
  15.    return 1;
  16. }


 
Pour plus d'info http://www.progzone.free.fr/reseau [...] async.html
 
 

Reply

Marsh Posté le 20-10-2006 à 20:07:49    

Merci pour ton aide Bad_Day.
 
 

Reply

Marsh Posté le 20-10-2006 à 21:57:00    

Tu seras pas en m1 info à nantes par hasard ? j'ai le même projet :D

Reply

Marsh Posté le 21-10-2006 à 10:51:43    

guiguivts a écrit :

Tu seras pas en m1 info à nantes par hasard ? j'ai le même projet :D


Ah non, je ne suis ni a nantes ni en info  :)  , mais en peut s'entre aider si tu veut car là je galére un peut  :p  .
 

Reply

Marsh Posté le 21-10-2006 à 17:40:28    

Bien j'y connais pas grand chose  :sarcastic:  
 
Est ce que tes clients recoivent et ecrivent sous la même console ? car chez moi ça crée des problemes quand il fait les deux en meme temps. je voie bien pourquoi mais je sais pas trop comment résoudre ça, je pensais qu'il pourrait écrire sous un terminal et recevoir sous un autre c'est faisable ?

Reply

Marsh Posté le 21-10-2006 à 18:03:57    

guiguivts a écrit :

Bien j'y connais pas grand chose  :sarcastic:  
 
Est ce que tes clients recoivent et ecrivent sous la même console ? car chez moi ça crée des problemes quand il fait les deux en meme temps. je voie bien pourquoi mais je sais pas trop comment résoudre ça, je pensais qu'il pourrait écrire sous un terminal et recevoir sous un autre c'est faisable ?


 
bah Oui c'est sous la méme console que le client ecrit et recoit... mais je galére aussi.
je croi que ce n'ai pas bien pratique qu'il reçoi dans une consol et ecrit dans une autre.
 


Message édité par big_dadi_fat le 21-10-2006 à 18:06:13
Reply

Marsh Posté le 26-10-2006 à 15:28:52    

guiguivts a écrit :

Bien j'y connais pas grand chose  :sarcastic:  
 
Est ce que tes clients recoivent et ecrivent sous la même console ? car chez moi ça crée des problemes quand il fait les deux en meme temps. je voie bien pourquoi mais je sais pas trop comment résoudre ça, je pensais qu'il pourrait écrire sous un terminal et recevoir sous un autre c'est faisable ?


 
C'est faisable, mais dans ton cas je crois que si tu utilise les threads c'est mieux...
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed