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

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

Marsh Posté le 19-03-2008 à 15:18:12    

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
Reply

Marsh Posté le 19-03-2008 à 15:18:12   

Reply

Marsh Posté le 20-03-2008 à 14:45:23    

up

Reply

Marsh Posté le 20-03-2008 à 16:44:29    

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
Reply

Marsh Posté le 21-03-2008 à 16:09:39    

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

Reply

Marsh Posté le 21-03-2008 à 16:39:59    

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

Reply

Sujets relatifs:

Leave a Replay

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