echange de messages entre client et serveur.... [socket] - C - Programmation
Marsh Posté le 04-10-2006 à 16:03:14
Salut
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.
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 |
Très joli les effets colorés...
Bad_Day a écrit : |
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 :
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...
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)...
Marsh Posté le 04-10-2006 à 16:36:32
ReplyMarsh Posté le 04-10-2006 à 21:06:04
rtfm = Read The Fuck Manual => lit le man...
Marsh Posté le 04-10-2006 à 21:46:53
Sve@r a écrit : rtfm = Read The Fuck Manual => lit le man... |
Fuck'n
Marsh Posté le 06-10-2006 à 12:53:00
C'est quoi l'equivalent de fcntl() sous windows, je ne trouve pas
Marsh Posté le 17-10-2006 à 14:12:19
http://f0rked.com/flash/v=fuck
pour plus d'info sur la definition du mot...
Marsh Posté le 17-10-2006 à 15:39:28
Bad_Day a écrit : http://f0rked.com/flash/v=fuck |
Marsh Posté le 20-10-2006 à 16:40:59
big_dadi_fat a écrit : euh UP |
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 ?
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, |
j'ai chérché mais je ne trouve pas !
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 :
|
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 :
|
Pour plus d'info http://www.progzone.free.fr/reseau [...] async.html
Marsh Posté le 20-10-2006 à 21:57:00
ReplyMarsh 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 |
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 .
Marsh Posté le 21-10-2006 à 17:40:28
Bien j'y connais pas grand chose
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 ?
Marsh Posté le 21-10-2006 à 18:03:57
guiguivts a écrit : Bien j'y connais pas grand chose |
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.
Marsh Posté le 26-10-2006 à 15:28:52
guiguivts a écrit : Bien j'y connais pas grand chose |
C'est faisable, mais dans ton cas je crois que si tu utilise les threads c'est mieux...
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 .
Jai 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