Salut, je développe actuellement une application réseau avec les sockets, qui consiste en gros en deux fichiers qui s'échangent des messages en UDP.
D'un côté, j'ai un serveur qui écoute sur un port, et de l'autre un client qui envoie au serveur ce que l'utilisateur à écrit sur stdin. Le serveur reçoit le message et lui répond.
Pour faire ça, j'ai fait à peu près ceci :
avec les méthodes suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 int nr; fd_set readfds, readfds2; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); // stdin FD_SET(sockfd, &readfds); // serveur maxSock = sockfd + 1; while(1) { readfds2 = readfds; nr = select(maxSock, &readfds2, NULL, NULL, NULL); if(nr != -1) { if(FD_ISSET(STDIN, &readfds2)) { char msgRecherche[TAILLEMSGSTDIN]; receptionSTDIN(msgRecherche); sendMessage(msgRecherche); } if(FD_ISSET(sockfd, &readfds2)) { char buf[1024]; recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&serveur, &tolen); printf("%s\n", buf); } } }
Les variables sockfd, serveur et tolen sont considérées comme globales, et correspondent respectivement au descripteur de socket, à la structure sockaddr_in relative au serveur et à la taille sizeof de cette structure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void receptionSTDIN(char *msg) { ssize_t length = read(STDIN, msg, TAILLEMSGSTDIN-1); // on remplace le '\n' de fin par un \0 char *p = strchr (msg, '\n'); if (p) *p = 0; } void sendMessage(char *msg) { if(sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr *)&serveur, tolen) == -1) { perror("erreur a l'appel de la fonction sendto -> "); leave(1); } }
Et maintenant mon problème :
Avec le code fait ainsi, je n'arrive qu'à avoir le scénario suivant : je lance le programme, j'écris sur stdin, j'envoie la chaîne, je vérifie que le serveur envoie bien la réponse, mais le client bloque sur le select à ce moment-là ! C'est donc qu'il ne reçoit rien ?
Autre point, peut-être lié au premier, si je remplace dans le code ci-dessus les instructions :
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if(nr != -1) { if(FD_ISSET(STDIN, &readfds2))
alors, le mot "reception" va s'afficher dès que j'écrirais sur la console, c'est-à-dire dès que des caractères seront disponibles en lecture sur stdin...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if(nr != -1) { printf("reception"); if(FD_ISSET(STDIN, &readfds2))
Je suppose que j'ai du louper une étape, ou mal faire quelque chose, car le serveur qui écoute sur une seule socket en UDP (et pas sur stdin) marche très bien...
Donc si quelqu'un avait une idée, je suis preneur !!
Merci d'avance !!
Partager