client/serveur, envoyer des msg en meme temps [sockets] - C - Programmation
Marsh Posté le 04-09-2006 à 12:12:04
Hé c'été mon probléme ca http://forum.hardware.fr/hardwaref [...] 5521-1.htm
J'aimerai bien savoir aussi.
Marsh Posté le 04-09-2006 à 17:03:14
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
Marsh Posté le 04-09-2006 à 18:26:03
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();
Marsh Posté le 04-09-2006 à 19:35:56
big_dadi_fat a écrit : Oui mes il dois y avoire une fonction pour que le prog soit asynchrone.... non |
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 ?
Marsh Posté le 04-09-2006 à 23:35:08
big_dadi_fat a écrit : Salut |
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
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" )
- utiliser les threads. L'un peut rester bloqué en lecture, l'autre continue à s'exécuter pour envoyer des données
voila voila
Marsh Posté le 05-09-2006 à 12:36:17
CNeo a écrit : Comment veux-tu que le serveur puisse envoyer qqch s'il ne sait pas quoi ? |
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...
Marsh Posté le 05-09-2006 à 13:26:37
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 )
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
Marsh Posté le 05-09-2006 à 15:18:28
mrbebert a écrit : Mais je ne suis pas sur que ca réponde vraiment à ton problème qui est d'envoyer tout en recevant |
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()
Marsh Posté le 05-09-2006 à 16:51:34
Je ne connaissais pas cette fonction poll, ca veut dire que mes connaissances sont déja périmées
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 )
Marsh Posté le 21-10-2006 à 17:55:17
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
Marsh Posté le 04-09-2006 à 12:03:14
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.