Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
718 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Fonction fcntl

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction fcntl

n°1286937
AlphaZone
Posté le 18-01-2006 à 18:48:23  profilanswer
 

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
mood
Publicité
Posté le 18-01-2006 à 18:48:23  profilanswer
 

n°1287213
Sve@r
Posté le 18-01-2006 à 23:23:22  profilanswer
 

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.
n°1290340
AlphaZone
Posté le 23-01-2006 à 17:35:16  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Fonction fcntl

 

Sujets relatifs
Fonction SQLRequest non définie![Résolu]Fonction Pos : mon code ne marche pas
Utilser une fonction d'une DLL d'un driver XP dans une autre DLL ?excel : fonction pour effacer le contenu d'une cellule
Facteur de deplacement avec fonction scaleSoucis avec fonction
pointeur de fonctionRetour d'une fonction
[VBA PPT2003] Fonction FileDialog(msoFileDialogSaveAs) choix du filterFonction FormulaR1C1 qu ine marche pas tout les jours
Plus de sujets relatifs à : Fonction fcntl


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR