AlphaZone | 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 - Client -----[ login:pass ]-----> SRV1 ------[ login:pass:ipClient ]------> SRV2
- 2 - SRV2 <=> vérification
- 3 - SRV2 -----[ OK/BAD ]-----> SRV1 ------[ si OK: PortSrv2, sinon BAD ]------> Client
- 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 :
- /* Creation de la connexion serveur */
- tSrv2.sockSrv2 = createConnexion(tSrv2.port2, &(tSrv2.adrSrv2), 1);
- if(tSrv2.sockSrv2 == ERROR)
- return EXIT_FAILURE;
- sz_sock = sizeof(struct sockaddr_in);
- /* attente des clients et recupere les donnes du client */
- tSrv2.sockSrv1 = accept(tSrv2.sockSrv2, (struct sockaddr*)&(tSrv2.adrClient), &sz_sock);
- while(1){
- // - 1 -----------------------------------------------------------
- fcntl(tSrv2.sockSrv1, F_SETFD, O_NONBLOCK);
- /* lecture des informations envoyé par le srv1 du client */
- memset(buf, '\0', size_buf);
- sz_buf = read(tSrv2.sockSrv1, buf, size_buf);
- buf[sz_buf] = EOL;
- printf("** Buffer : %s **\n", buf);
- // Envoie de la confirmation au serveur 1
- res = sendConfirm(buf, users, nUsers, tSrv2.sockSrv1);
- // ---------------------------------------------------------------
- // - 2 -----------------------------------------------------------
- while(1){
- if(res == OK){
- tSrv2.sockClient = accept(tSrv2.sockSrv2, (struct sockaddr*)&(tSrv2.adrClient), &sz_sock);
- fcntl(tSrv2.sockClient, F_SETFD, O_NONBLOCK);
- write(tSrv2.sockClient, "Srv2", 4);
- }
- }
- // ---------------------------------------------------------------
- }
|
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. |