Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 62 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

PB : Comment lier plus de 2 PC par socket ?!?!?!

 
n°12532
dddd2
Profil : Jeune recrue
Posté le 13-04-2005 à 16:36:31  profilanswer
 

Salut :)  
J'ai un prog de tchat en C qui fonctionne trés bien mais il ne permet la communication seulement qu'entre 2 PC.
 :)  
Je n'arrive pas a etablir une connection avec un 3eme PC.
Voila les progs (J'ai suprrimé ce qui était inutile j'ai laissé que la partie réseau des progs) :
(Je réalise mes essai sur le meme ordi.)
 
SERVEUR:
 
#include <stdlib.h>
#include <stdio.h>  
#include <dos.h>  
#include <conio.h>  
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib" )
 
int main()
{  
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2,0), &WSAData);
 
 SOCKET sock;
 SOCKADDR_IN sin;
 SOCKADDR_IN csin;
 
 sock = socket(AF_INET, SOCK_STREAM, 0);
 sin.sin_addr.s_addr = INADDR_ANY;
 sin.sin_family     = AF_INET;
 sin.sin_port     = htons(4444);
 
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
 listen(sock, 0);
        printf("Attente d'une connection...\n" );
 int sinsize = sizeof(csin);
 
 sock = accept(sock, (SOCKADDR *)&csin, &sinsize);
 printf("connection etablie\n\n" );
 u_long argp=1;     /*mode non bloquant*/
 ioctlsocket(sock, FIONBIO, &argp);
 
 do
 {
 
/*dialogue entre les untilisateurs avec "recv()" et "send()" */
 
 bind(sock, (SOCKADDR *)&sin, sizeof(sin));
 listen(sock, 0);
 int sinsize = sizeof(csin);
   
 sock = accept(sock, (SOCKADDR *)&csin, &sinsize);
 printf("OK" );
/*J'ai ajouté ca dans la boucle pour rendre le serveur dispo nimporte quant*/
 
 Sleep(10);/*pour pas bloquer le CPU*/
 }while(!quit);
 
CLIENT :Je le lance 2 fois ce prog pour avoir 3personnes connectés  
(2 Clients + 1 Serveur)
 
#include <stdlib.h>
#include <stdio.h>    
#include <conio.h>  
#include <dos.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib" )
 
int main()
{
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2,0), &WSAData);
 
 SOCKET sock;
 SOCKADDR_IN sin;
 char ip[16];
 
 textcolor(10);
 cprintf("Entrer l'adresse IP du serveur\r\n" );
 gets(ip);
 
 sock = socket(AF_INET, SOCK_STREAM, 0);
 sin.sin_addr.s_addr = inet_addr(ip);
 sin.sin_family     = AF_INET;
 sin.sin_port     = htons(4444);
 
 connect(sock, (SOCKADDR *)&sin, sizeof(sin));
 u_long argp=1; /* pour passer en mode non bloquant */
 ioctlsocket(sock, FIONBIO, &argp);
 
  do
  {
 
 /*dialogue entre les untilisateurs avec "recv()" et "send()" */
  Sleep(10);/*pour pas bloquer le CPU*/
  }while(!quit);
 
 closesocket(sock);/*fermeture*/
 WSACleanup();
 return(0);
}

 
 
Voila quant je rajoute mon bout de texte ca marche plus : on dirait que ca reconnecte le client deja connecté. Et ya rien qui passe aucun dialogue. Il faut peut être utiliser des socket de nom différent un pour chaque client.? :??:


Message édité par dddd2 le 13-04-2005 à 16:41:26
n°12533
P-Y
Profil : Vieux de la vieille
Posté le 13-04-2005 à 16:45:41  profilanswer
 

C'est normal, une socket faut voirca comme un tuyau, ca n'a que 2 extremites donc ca ne perment de communiquer qu'entre 2 PC...
Si tu veux faire plus, il te faut developper un programme serveur qui centralise les connexions venant des differents PC, et un programme client qui se connecte sur ce serveur, qui sera lui installe sur chacun des autres PC ;)

n°12537
dddd2
Profil : Jeune recrue
Posté le 13-04-2005 à 19:18:48  profilanswer
 

ok :)  mais comment fait t'on pour connecter un 2eme client sur le serveur. Je suppose qu'il faut utiliser un socket de nom différent pour chaque client sinon le serveur se mélange dans les noms de sockets? :??:  
j'ai déja fait quelques essai mais je ne comprend pas a quoi correspondent tout ces sockets:  :fou:  :fou:  
 
accept(sock, (SOCKADDR *)&csin, &sinsize);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
connect(sock, (SOCKADDR *)&sin, sizeof(sin));
 
entre 2 PC c'était simple il y avait un seul socket mais la ca devient compliqué. Les tutos que j'ai trouvé n'utilisent qu'un seul socket et je n'ai aucune idée a quels socket revoit ces fonctions.
Si on veut crée un 2eme socket client-serveur, on doit l'appeler différament du 1er  :??: et mettre :
"accept(sock2, (SOCKADDR *)&csin, &sinsize);"
il faut alors déclarer "sock2" dans le prog serveur ca voudrait dire qu'il faut déclarer tout les sockets possibles et tous les mettre en ecoute avec
"listen(sock2,0);" :??:  :??:  
 :)  
Je ne voit pas trop comment utiliser les fonctions.
Je ne suis pas trop une bête en réseau mais si quelqun veut bien m'expliquer je lui en serait reconnaisant.
Merci :)


Message édité par dddd2 le 13-04-2005 à 19:21:31
n°12851
dddd2
Profil : Jeune recrue
Posté le 29-04-2005 à 19:13:28  profilanswer
 

C'est bon mon problème est résolut
:)
Merci :)


Aller à :
Ajouter une réponse