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


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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if(nr != -1)
{
	if(FD_ISSET(STDIN, &readfds2))
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
if(nr != -1)
{
	printf("reception");
	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...


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