Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1455 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1451008
big_dadi_f​at
Posté le 02-10-2006 à 18:43:21  profilanswer
 

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
mood
Publicité
Posté le 02-10-2006 à 18:43:21  profilanswer
 

n°1452253
Bad_Day
Posté le 04-10-2006 à 16:03:14  profilanswer
 

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
n°1452268
Sve@r
Posté le 04-10-2006 à 16:22:31  profilanswer
 

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.
n°1452276
big_dadi_f​at
Posté le 04-10-2006 à 16:32:32  profilanswer
 

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

n°1452281
Bad_Day
Posté le 04-10-2006 à 16:36:32  profilanswer
 

big_dadi_fat a écrit :

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


 
rtfm
 

n°1452439
Sve@r
Posté le 04-10-2006 à 21:06:04  profilanswer
 


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


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1452477
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-10-2006 à 21:46:53  profilanswer
 

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/
n°1452660
big_dadi_f​at
Posté le 05-10-2006 à 10:49:47  profilanswer
 

ok ok, je vais voir...
 

n°1453331
big_dadi_f​at
Posté le 06-10-2006 à 12:53:00  profilanswer
 

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

n°1458702
Bad_Day
Posté le 17-10-2006 à 14:12:19  profilanswer
 


 
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
mood
Publicité
Posté le 17-10-2006 à 14:12:19  profilanswer
 

n°1458857
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-10-2006 à 15:39:28  profilanswer
 

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/
n°1461547
big_dadi_f​at
Posté le 20-10-2006 à 16:31:41  profilanswer
 

euh  UP  :whistle:  

n°1461555
Bad_Day
Posté le 20-10-2006 à 16:40:59  profilanswer
 


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 ?
 

n°1461559
big_dadi_f​at
Posté le 20-10-2006 à 16:44:51  profilanswer
 

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 !
 

n°1461599
Bad_Day
Posté le 20-10-2006 à 17:53:14  profilanswer
 

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


 
 
 

n°1461609
Bad_Day
Posté le 20-10-2006 à 18:04:20  profilanswer
 

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
 
 

n°1461660
big_dadi_f​at
Posté le 20-10-2006 à 20:07:49  profilanswer
 

Merci pour ton aide Bad_Day.
 
 

n°1461694
guiguivts
Posté le 20-10-2006 à 21:57:00  profilanswer
 

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

n°1461822
big_dadi_f​at
Posté le 21-10-2006 à 10:51:43  profilanswer
 

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  .
 

n°1462049
guiguivts
Posté le 21-10-2006 à 17:40:28  profilanswer
 

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 ?

n°1462069
big_dadi_f​at
Posté le 21-10-2006 à 18:03:57  profilanswer
 

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
n°1465500
Bad_Day
Posté le 26-10-2006 à 15:28:52  profilanswer
 

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...
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Socket, problème à l'écriture.[Résolu]Client/serveur qui marche qu'en local
Se connecter au serveur Mysql[VB6] Serveur ftp
TCP chat server/clientChanger un paramètre NLS sur Client Oracle (XP)
[C#] Timer sur les évènements des messages WindowsCreation d'un mini client ftp
limitation connexion serveur linux en c 
Plus de sujets relatifs à : [socket] echange de messages entre client et serveur....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR