Fonction fcntl

Fonction fcntl - C - Programmation

Marsh Posté le 18-01-2006 à 18:48:23    

Bonjour à tous,
 
Alors voila j'ai un gros gros soucis. Via mes études, on nous a demandé de développer un "t'chat" en C.
 
Le principe de fonctionnement est le suivant :
On dispose d'un serveur 1 (SRV1) et d'un serveur 2 (SRV2) qui sont 2 programmes et biensur d'un client.
Dans un premier temps le client saisi un login et mot de passe. Ces données sont envoyé au SRV1 qui le retransmet au SRV2 mais avec en plus l'IP du client.
Le SRV2 vérifi les identifiants du client à partir d'une liste d'utilisateur.
Si c'est OK, le SRV2 envoie une confirmation au SRV1, qui envoie le port du SRV2 au client.
Une fois l'identification réussi, le client se connecte directement au SRV2.
Une fois connecté au SRV2, il peut enfin t'chatter avec ses amis.
 
En résumé cela donne ca:

Code :
  1. 1 - Client -----[ login:pass ]-----> SRV1 ------[ login:pass:ipClient ]------> SRV2
  2. 2 - SRV2 <=> vérification
  3. 3 - SRV2 -----[ OK/BAD ]-----> SRV1 ------[ si OK: PortSrv2, sinon BAD ]------> Client
  4. 4 - Client ----------> Srv2


 
 
 
Tout fonctionne (connexion, vérification, confirmation), sauf que mon problème se situe dans le SRV2.
En faite, à partir d'une boucle while principale, je dois mettre des "sous" boucles while. Celles-ci étant indépendantes les une des autres grâce à la fonction fcntl. Et enfin, ce qui me pose problème est que je ne sais pas trop comment me servir la cette fonction, comment gérer les boucles whiles.
 
Voici un bout du code du SRV2 :

Code :
  1. /* Creation de la connexion serveur */
  2.         tSrv2.sockSrv2 = createConnexion(tSrv2.port2, &(tSrv2.adrSrv2), 1);
  3.         if(tSrv2.sockSrv2 == ERROR)
  4.           return EXIT_FAILURE;
  5.         sz_sock = sizeof(struct sockaddr_in);
  6.         /* attente des clients et recupere les donnes du client */
  7.         tSrv2.sockSrv1 = accept(tSrv2.sockSrv2, (struct sockaddr*)&(tSrv2.adrClient), &sz_sock);
  8.         while(1){
  9.           // - 1 -----------------------------------------------------------
  10.           fcntl(tSrv2.sockSrv1, F_SETFD, O_NONBLOCK);
  11.           /* lecture des informations envoyé par le srv1 du client */
  12.           memset(buf, '\0', size_buf);
  13.           sz_buf = read(tSrv2.sockSrv1, buf, size_buf);
  14.           buf[sz_buf] = EOL;
  15.           printf("** Buffer : %s **\n", buf);
  16.           // Envoie de la confirmation au serveur 1
  17.           res = sendConfirm(buf, users, nUsers, tSrv2.sockSrv1);
  18.           // ---------------------------------------------------------------
  19.           // - 2 -----------------------------------------------------------
  20.           while(1){
  21.             if(res == OK){
  22.               tSrv2.sockClient = accept(tSrv2.sockSrv2, (struct sockaddr*)&(tSrv2.adrClient), &sz_sock);
  23.               fcntl(tSrv2.sockClient, F_SETFD, O_NONBLOCK);
  24.               write(tSrv2.sockClient, "Srv2", 4);
  25.             }
  26.           }
  27.           // ---------------------------------------------------------------
  28.         }


 
 
Est-ce que de cette facon le while situé au 2, tournera de facon asynchrone ?
Est-ce la façon dont j'ai codé mes éléments feront chaque partie sera asynchrone ?
 
J'espère que vous ne serez pas trop perdu dans mes explications et que vous pourrez m'orienter vers le bon chemin ;)
 
Je vous remerci d'avance.

Message cité 1 fois
Message édité par AlphaZone le 18-01-2006 à 18:49:18
Reply

Marsh Posté le 18-01-2006 à 18:48:23   

Reply

Marsh Posté le 18-01-2006 à 23:23:22    

AlphaZone a écrit :

En faite, à partir d'une boucle while principale, je dois mettre des "sous" boucles while. Celles-ci étant indépendantes les une des autres grâce à la fonction fcntl. Et enfin, ce qui me pose problème est que je ne sais pas trop comment me servir la cette fonction, comment gérer les boucles whiles.


 
Hum... je ne savais pas que la fonction "fcntl" avait pour but de rendre des boucles "while()" indépendantes. D'ailleurs, je ne comprends même pas ta notion d'indépendance.

while(i > 0)
   i--;
 
while (j > 0)
   j--;


 
Là, j'ai deux boucles "while" totalement indépendantes l'une de l'autre... et sans utiliser "fcntl"
 
Bon, arrêtons le massacre et va voir ces liens


Message édité par Sve@r le 18-01-2006 à 23:23:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-01-2006 à 17:35:16    

C'est bon, j'ai pu obtenir de plus ample information et en faite ce n'était pas F_SETFD que je devais utiliser mais F_SETFL.
 
D'ailleur je devais également déclarer cette fonction à l'extérieur de la boucle while. Dorénavant mes fonctions sont devenues non blockante. Et non le fait de rendre mes boucles while indépendante comme je l'avais compris.
 
Voici mon nouvel algoritme (en résumé):

Code :
  1. TantQue(1)
  2.   Lire SRV1
  3.   AccepterClient
  4.   Pour i allant de 0 à nClient-1
  5.     // T'chat
  6.   FPour
  7. FTantQue


 
 
En tout cas merci pour ton coup de main.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed