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

  FORUM HardWare.fr
  Programmation
  C

  [sockets] client/serveur, envoyer des msg en meme temps

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[sockets] client/serveur, envoyer des msg en meme temps

n°1436190
big_dadi_f​at
Posté le 04-09-2006 à 12:03:14  profilanswer
 

Salut  :hello:  
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.  ;)  
 

mood
Publicité
Posté le 04-09-2006 à 12:03:14  profilanswer
 

n°1436195
Bad_Day
Posté le 04-09-2006 à 12:12:04  profilanswer
 

Hé c'été mon probléme ca  :lol:  http://forum.hardware.fr/hardwaref [...] 5521-1.htm
J'aimerai bien savoir aussi.

n°1436333
franceso
Posté le 04-09-2006 à 17:03:14  profilanswer
 

normalement, dans une socket il y a deux canaux de communication : client->serveur et serveur->client. Du coup, le serveur et le client peuvent écrire en même temps chacun à un bout de la socket sans que les messages se téléscopent.
 
Donc d'après moi c'est possible. Il suffit de bien programmer le client et le serveur pour que les communications soient asynchrones.
 
Je suis pas spécialiste donc j'espère que j'ai pas dit de connerie :sweat:


---------------
TriScale innov
n°1436384
big_dadi_f​at
Posté le 04-09-2006 à 18:26:03  profilanswer
 

Oui mes il dois y avoire une fonction pour que le prog soit asynchrone.... non  :(  
Parceque là selement avec ce que j'ai je n'arrive pas vraiment a faire grend chôse .
 
Par contre on chérchant un peut sur google sur ce truc , j'ai trouvé quand parlais baucoup de la fonction selecte();

Message cité 1 fois
Message édité par big_dadi_fat le 04-09-2006 à 18:32:55
n°1436407
CNeo
Posté le 04-09-2006 à 19:35:56  profilanswer
 

big_dadi_fat a écrit :

Oui mes il dois y avoire une fonction pour que le prog soit asynchrone.... non  :(  
Parceque là selement avec ce que j'ai je n'arrive pas vraiment a faire grend chôse .
 
Par contre on chérchant un peut sur google sur ce truc , j'ai trouvé quand parlais baucoup de la fonction selecte();


Comment veux-tu que le serveur puisse envoyer qqch s'il ne sait pas quoi ?
Peut-être que certaines choses peuvent être envoyées en même temps mais la question est : est-ce utile ?

n°1436509
mrbebert
Posté le 04-09-2006 à 23:35:08  profilanswer
 

big_dadi_fat a écrit :

Salut  :hello:  
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.  ;)

Non, pas forcément. D'ailleurs, on peut très bien avoir un ordi qui ne fait qu'envoyer et l'autre qui ne fait que recevoir (indépendamment des acquittements TCP/IP) :)  
J'imagine que ton problème est plutôt : comment avoir un programme qui puisse à la fois envoyer et recevoir :D  
Y a 3 grands principes :
- 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
- regarder s'il y a quelque chose à lire avant de faire une lecture (c'est peut être là qu'intervient la fonction "select" [:figti] )
- utiliser les threads. L'un peut rester bloqué en lecture, l'autre continue à s'exécuter pour envoyer des données
voila voila :D

n°1436690
big_dadi_f​at
Posté le 05-09-2006 à 12:36:17  profilanswer
 

CNeo a écrit :

Comment veux-tu que le serveur puisse envoyer qqch s'il ne sait pas quoi ?


 :heink:  

CNeo a écrit :

Peut-être que certaines choses peuvent être envoyées en même temps mais la question est : est-ce utile ?


Mais bien sur que c'est utile (ta lu mon premier poste ?), je veut que le (serveur par exemple) puissent envoyer un message au client et qu'il peut ensuite reenvoyer un autre message sans qu'il soit obligé d'attendre la reponse du client. (voir le code source du lien dans le 2éme poste de Bad_Day).
 

Citation :

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


effectivemt, en cherchant un peut j'ai trouvé que qu'on peut le faire avec la fonction fcntl(sockfd, F_SETFL, O_NONBLOCK); (voire : http://vidalcharles.free.fr/lf/socket.html ==> Blocage).
Mais ils disent que

Citation :

...D'une manière générale, ce type d'interrogation est plutôt une mauvaise idée. Si vous faites un programme qui attends les données sur une socket non bloquante, vous allez prendre beaucoup de ressource système inutilement. Une manière plus élégante pour voir s'il y a des données qui sont arrivées est d'utiliser la fonction select() ...


Alors ok je chérche select(); ... Mais je ne comprend pas bien comment l'utiliser  (voire: http://vidalcharles.free.fr/lf/socket.html ==> select()--Multiplexage Synchrone d'E/S)....
 
Et en plus je croi que cette fonction select() n'est utilisable que sur Unix...
 

n°1436729
mrbebert
Posté le 05-09-2006 à 13:26:37  profilanswer
 

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 :D )
 
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 :)  
Mais je ne suis pas sur que ca réponde vraiment à ton problème qui est d'envoyer tout en recevant [:psychokwak]

n°1436838
franceso
Posté le 05-09-2006 à 15:18:28  profilanswer
 

mrbebert a écrit :

Mais je ne suis pas sur que ca réponde vraiment à ton problème qui est d'envoyer tout en recevant [:psychokwak]

Je pense que son problème, c'est d'avoir un système de communications asynchrone, donc +1 pour select()
 
@big_dadi_fat:
la page de man de select te donne un bon exemple d'utilisation de select.
 
Tu devrais essayer de te renseigner aussi sur la fonction poll() (il me semble que Taz a mentionné une troisième fonction du même genre récemment, mais je ne sais plus laquelle). Toutes ces fonctions servent à faire du polling, comme te l'a expliqué mrbebert.
 
L'intérêt pour toi (si j'ai bien compris), c'est que ton serveur peut envoyer des messages au client quand il veut, sans trop se soucier des réponses. Les réponses sont traitées indépendamment (c'est ce qui fait que c'est asynchrone) au fur et à mesure qu'elles arrivent (ce que tu détectes grâce au polling).
 
EDIT: le message de Taz auquel je faisais référence. La troisième fonction de polling est epoll()


Message édité par franceso le 05-09-2006 à 15:59:32

---------------
TriScale innov
n°1436869
big_dadi_f​at
Posté le 05-09-2006 à 15:53:49  profilanswer
 

merci pour votre aide je vais voire tout ca  :)  
 

mood
Publicité
Posté le 05-09-2006 à 15:53:49  profilanswer
 

n°1436925
mrbebert
Posté le 05-09-2006 à 16:51:34  profilanswer
 

Je ne connaissais pas cette fonction poll, ca veut dire que mes connaissances sont déja périmées [:alph-one]  
 
Sinon, il reste aussi la possibilité de faire la réception dans un thread, qui peut rester bloqué en lecture sur la socket sans géner le traitement qui fait l'envoi (ou inversement) :)  
(il me semble que ca ne pose pas de problème de lire et écrire depuis 2 threads sur une même socket [:figti] )

n°1462062
guiguivts
Posté le 21-10-2006 à 17:55:17  profilanswer
 

Un peu en retard mais vu que je suis en plein de dedans je répond ^^
 
Moi j'utilise les threads et ça marche très bien :) un thread qui recoit et un qui émet :)  
 
ça ne pose pas de probleme de lire et d ecrire sur le meme socket en revanche ecrire et lire sur le même terminal c'est problématique et pour le moment j'ai pas de solution :(


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

  [sockets] client/serveur, envoyer des msg en meme temps

 

Sujets relatifs
[javascript] Commande smtp pour envoyer un mailServeur SQL, comportement étrange.
Temps d'execution d'un scriptUpload de fichier vers un serveur php
[C#] Comment indiquer l'état d'avancement d'un traitement au client ?[winsock] Client/Server simplifié....
script alternatifs pour connexion à un serveur MySQLcréer un "envoyer vers" dans une macro Word
Serveur gestion des sessionsProbleme avec mon code source pour les sockets
Plus de sujets relatifs à : [sockets] client/serveur, envoyer des msg en meme temps


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