Hello !
Voila je fait un programme en c++ qui comporte un executable client et un executable serveur.
Pour info, il s'agit d'un petit quizz qui doit pouvoir se jouer a 2 (les clients se connectent au serveur et celui qui repond le plus vite gagne).
Là mon programme marche pas trop mal, mais je galère un peu sur l'implementation du deuxieme joueur.
Le serveur contient 2 sockets avec 2 ports differents (2048 et 2049).
Ce que je compte faire, pour qu'il n'y ai qu'un executable client et non un pour chaque joueur, c'est que celui ci essaie de se connecter au serveur avec le port 2048, et s'il y a deja quelqu'un dessus (l'executable a donc deja eté lancé et il y a déjà un joueur de connecté) le client doit utiliser le port 2049.
J'ai fait ca comme ca :
Code :
- // on se connecte au serveur
- int instance;
- // le joueur se connecte sur le port 2048
- sock = socket(AF_INET, SOCK_STREAM, 0);
- sin.sin_addr.s_addr = inet_addr(ipserveur);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(2048);
- instance=connect(sock, (SOCKADDR *)&sin, sizeof(sin));
- // si le port 2048 est deja utilisé, c'est que le premier joueur est deja connecté, on utilise donc le port 2049
- if (instance != 0)
- {
- sin.sin_port = htons(2049);
- connect(sock, (SOCKADDR *)&sin, sizeof(sin));
- }
|
Quand je fait comme ca, le premier joueur se connecte sans probleme, et si je relance le client, il reste bloqué au niveau du connect (connect ne renvoie pas d'erreur), comme s'il continuais a tenter de se connecter sur ce port déjà utilisé sans retourner de message d'erreur.
Par contre, si je lance une 3eme fois l'executable client, le connect renvoie bien une erreur, et on rentre donc dans la boucle qui permet de changer de port, et la tout marche bien.
J'aimerais donc savoir comment je pourrais faire pour rentrer dans cette boucle si le port 2048 est déjà utilisé, est il possible par exemple de faire une tentative de connect pendant 2 sec, et si ca ne fonctionne pas, de rentrer dans la boucle, plutot que de rester bloqué sur ce connect ?
Voilà j'espère avoir été assez clair et vous remercie d'avance pour vos idées sur ce probleme qui me donne du fil à retorde
Message édité par bottedumal le 19-03-2008 à 15:23:48