Bonjour, je suis en train de faire un petit chat en C en utilisant les sockets sous Linux.
J'en suis a essayé de renvoyer à tous les clients connectés un message reçu par le serveur. Pour cela, j'ai le descripteur de socket de chaque client dans le serveur. Je me sers de ses descripteurs pour communiquer avec tous les clients (enfin j'aimerais pour le moment).
Voici le code du serveur :
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  listen(sd,MAXCLIENT);
  ladcour=sizeof(adclcour);
  for(;;)
    {
      if((nsd=accept(sd,(struct sockaddr*)&adclcour,(socklen_t*)&ladcour))<0)
	{
	  perror(">>Probléme avec accept");
	  exit(1);
	}
      printf("nsd :: %d\n",nsd);
  /* Récupération du nom du client */
      if(cherche(adclcour.sin_addr.s_addr,liste_cl,nb_client)==-1)
	{
	  printf("traitement nom\n");
	  FD_SET(nsd,&ensemble);
	  nsdbis=select(20,&ensemble,NULL,NULL,&timer);
	  if(nsdbis)
	    {
	      read(nsd,buf,sizeof(buf));
	      liste_cl[nb_client].ip=adclcour.sin_addr.s_addr;
	      strcpy(liste_cl[nb_client].nom,buf);
	      strcat(liste_cl[nb_client].nom," : ");
	      liste_cl[nb_client].soc=nsd;
	      nb_client++;
	      printf("%s est %s\n",(char*)inet_ntoa(liste_cl[nb_client-1].ip),liste_cl[nb_client-1].nom);
	      close(nsd);
	    }
	  else
	    {
	      write(nsd,"Resaisir le nom",strlen("Resaisir le nom"));
	      close(nsd);
	    }
	  timer.tv_sec = 5;
	}
      else
	{
	  if(fork()==0)
	    {
	      /* Traitement des messages */
	      printf("Traitement messages\n");
	      close(sd);
	      nu_client=cherche(adclcour.sin_addr.s_addr,liste_cl,nb_client);
	      printf("Client considéré :: %s\n",liste_cl[nu_client].nom);
	      renvoi(liste_cl[nu_client].soc, liste_cl,nu_client,nb_client);
	      exit(0);
	    }
	  else
	    close(nsd);
Pour le moment, j'arrive à communiquer avec n clients sur mon serveur. Mon serveur connait toutes les ips des clients.
Voyez vous une autre façon de communiquer avec tous les clients, sans utiliser les threads. Je pense que mon problème est lié au stockage des descripteurs de socket et à ma gestion des sockets... Je n'ai pas réussi à trouver la solution à mon problème alors si vous pouvez m'éclairer un peu...