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

  FORUM HardWare.fr
  Programmation
  C++

  [C++/Winsock] Petite question sur le connect()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++/Winsock] Petite question sur le connect()

n°1704719
bottedumal
open the Doors
Posté le 19-03-2008 à 15:18:12  profilanswer
 

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 :
  1. // on se connecte au serveur
  2. int instance;
  3. // le joueur se connecte sur le port 2048
  4. sock = socket(AF_INET, SOCK_STREAM, 0);
  5. sin.sin_addr.s_addr     = inet_addr(ipserveur);
  6. sin.sin_family    = AF_INET;
  7. sin.sin_port    = htons(2048);
  8. instance=connect(sock, (SOCKADDR *)&sin, sizeof(sin));
  9. // si le port 2048 est deja utilisé, c'est que le premier joueur est deja connecté, on utilise donc le port 2049
  10. if (instance != 0)
  11. {
  12. sin.sin_port    = htons(2049);
  13. connect(sock, (SOCKADDR *)&sin, sizeof(sin));
  14. }


 
 
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 :jap:


Message édité par bottedumal le 19-03-2008 à 15:23:48
mood
Publicité
Posté le 19-03-2008 à 15:18:12  profilanswer
 

n°1705384
bottedumal
open the Doors
Posté le 20-03-2008 à 14:45:23  profilanswer
 

up

n°1705486
tpierron
Posté le 20-03-2008 à 16:44:29  profilanswer
 

Euh, j'ai pas l'impression que t'aies compris comment fonctionne les sockets serveur. Juste pour info :
 

  • Ton serveur attends une connexion sur un certain port: bind()
  • Tu indiques ensuite la longueur de la file d'attente : listen() (qui porte mal son nom)
  • Tu attends une connexion : accept()
  • Quand un client se connecte sur le port, accept va te créer une nouvelle socket, libérant le port que tu écoutes.
  • Tu récupères/envoies les données sur la nouvelle socket.


Donc faire 2 ports différents pour 2 clients, ça ne sert à rien.


Message édité par tpierron le 20-03-2008 à 16:45:17
n°1706193
bottedumal
open the Doors
Posté le 21-03-2008 à 16:09:39  profilanswer
 

Ok merci pour cette explication :jap:
 
Mais du coup, avec les accept je créé 2 nouvelles sockets, une pour chaque joueur, et ces sockets utiliseront le meme port ? Ca pose pas de problemes que les 2 joueurs jouent sur le même port ?
 
J'ai un peu de temps là, je vais faire quelques tests :)

n°1706226
bottedumal
open the Doors
Posté le 21-03-2008 à 16:39:59  profilanswer
 

En effet on dirais que je me compliquais la vie ... Ca a l'air pas mal en créant de nouveau socket par le accept :)
 
Merci beaucoup tpierron


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

  [C++/Winsock] Petite question sur le connect()

 

Sujets relatifs
question sur la conception d'un formulaireJava : question affichage JTree
Petite questionpetite question
Question d'une débutante svpquestion simple ds Access
Question toute bête (je pense ^^)Info général - pour petite Appli de Parsage de log
Plus de sujets relatifs à : [C++/Winsock] Petite question sur le connect()


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