goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008
-
11 mai 2005 à 21:06
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008
-
13 mai 2005 à 12:39
Salut,
J'ai une petit question sur les sockets :
Je fait un test de multiclients (2 seulements ...) et j'ai un problème avec les ports.
Au niveau serveur :
Je déclare mon socket 1 => client 1 : sin_server1.sin_port= htons(7000);
Je déclare mon socket 2 => client 2 : sin_server2.sin_port= htons(7001);
Là ça marche, mais si je met le même port pour les 2 sockets ça marche plus
Alors comment je fais pour savoir quel port utiliser au niveau des clients ????
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 21:22
Salut,
Je comprend pas, combiens de sockets tu as coté serveur ? normalement il n'en faut qu'un! un part port sur lequel tu souhaites recevoir des connexions en fait.
//on associe l'ip et le port
bind(sock_server, (SOCKADDR *)&sin_server, sizeof(sin_server));
MessageBox(Dlg2,"Attente d'un joueur","Info",0|0);
listen(sock_server, 0); // on attend 1 seul joueur
while(quit != 1)
{
int sinsize = sizeof(csin_server);
// si un joueur se connecte
if((csock_server = accept(sock_server, (SOCKADDR*)&sin_server, &sinsize)) != INVALID_SOCKET)
{
// on signal le joueur connecté
MessageBox(Dlg2,"Client connecté","Info",0|0);
connection=1;
while (1)
{
memset(buf,0,sizeof buf);
recv(csock_server, buf, sizeof(buf), 0);
if (rec_data!=0) break;
}
Dlg2=FindWindow(NULL,"Serveur");
PostMessage(Dlg2, WM_CONNECTE, 0, 0);
quit = 1; // un joueuer est connecté, on sort de la boucle
}
}
Donc il suffit que je remplace : csock_server par csock_server2, csock_server3 ... ???
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 21:51
Salut,
Je comprend pas vraiment comment tu as structuré ton serveur.
Juste apres le accept() tu entres dans une boucle while:
while (1)
{
memset(buf,0,sizeof buf);
recv(csock_server, buf, sizeof(buf), 0);
if (rec_data!=0) break;
}
Vu que cette boucle bloque la boucle principale du serveur, tu ne pourra pas accepter d'autres connexions tant que tu n'aura pas reappelé accept().
Quant aux csock_server2, csock_server3, ou sont ils? a quoi servent ils?
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008 11 mai 2005 à 21:57
La boucle while() juste après le accept() sert à récupérer le nom du client.
Si je creée un structure Client[i].socket, je peux faire :
while(quit != 1)
{
int sinsize = sizeof(csin_server);
// si un joueur se connecte
if(Client[i].socket= accept(sock_server, (SOCKADDR*)&sin_server, &sinsize)) != INVALID_SOCKET)
{
// on signal le joueur connecté
MessageBox(Dlg2,"Client connecté","Info",0|0);
}
}
C'est bon ou pas ???
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 22:06
Salut,
La tu as la boucle de base qui accepte les connexions, elle a pas l'air d'etre bloquée (a part la messagebox) donc ca a l'air bon. Par contre comment gere tu les dialogues avec les clients ?
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008 11 mai 2005 à 22:26
Là j'ai qu'un seul client donc je lance le thread après la connexion :
hthread=CreateThread(NULL, NULL, ThreadServerProc, NULL, NULL, &ThreadServerID);
C'est ce thread là :
DWORD WINAPI ThreadServerProc(LPVOID lpParam)
{
while (1)
{
memset(rec_data,0,sizeof rec_data);
rec=recv(csock_server, rec_data, sizeof(rec_data), 0);
En fait c'est un peu compliqué car dans mon prog côté serveur j'ai un bouton STOP qui envoi "1" au client qui sort de son thread et qui lui ensuite renvoie "1" au serveur qui sort du thread.
Parce que j'ai 3 options : chat, transfert fichiers, parcours DD.
Mais dans le prog que je veux faire, je voudrais seulement un chat.
Par contre je sais pas comment gérer plusieurs dans ma boucle, peux tu m'aider STP ???
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 22:55
Salut,
Apparement tu as aussi oublié le mot dans le deuxieme post
Mais tu veux faire un chat entre 2 clients ou un serveur de tchat ou plusieurs clients se connectent pour tchater entre eux ?
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008 11 mai 2005 à 23:17
Ok, mais j'ai vu sur ce forum que un thread par client s'est pas terrible sous windows xp ...
Je voudrais faire un chat entre plusieurs clients en fait, un peu comme MSN messenger.
Mais comment faire car dans msn chaque utilisateur est à la fois client et serveur, ou alors il y a des serveurs chez microsoft qui redirigent tous les messages ???
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 23:33
Salut,
Effectivement sous windows la solution des thread est pas terrible du tout.
Sinon pour les msn (ou meme irc) c'est un gros serveur qui redirige tout les messages. Les connexions directes entre les clients posent des problemes (a cause des firewall, des routeurs, etc) donc on evite au maximum (sauf quand on ne peut pas faire autrement, comme par exemple dans le cas d'un transfert de fichier entre 2 clients).
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008 12 mai 2005 à 21:42
Ok,
Donc comment je fais pour faire un chat où les gens peuvent se parler entre eux, sans qu'il y ai besoin d'avoir un serveur en route en permanence ???
C'est trop compliqué ?
goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008 13 mai 2005 à 12:39
Comment je peux faire pour qu'il n'y ai pas besoin qu'il y ai une personne connectée en permancence car elle doit assurer son rôle de serveur ???
Aidez moi SVP ???