Sockets et ports

goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 11 mai 2005 à 21:06
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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 ????

12 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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.
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
11 mai 2005 à 21:38
Ah ok ...

Je reçois les clients comme ça :

WSAStartup(MAKEWORD(2, 0), &wsa_server);


//on crée le socket
sock_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


sin_server.sin_addr.s_addr = INADDR_ANY;
sin_server.sin_family= AF_INET;
sin_server.sin_port= htons(7000); //666


//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 ... ???
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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?
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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 ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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 ?
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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);


if ((rec_data!=0)&&(rec != -1)&&(rec != 0))
{
strcpy(buf2,rec_data);
PostMessage(Dlg2, WM_WRITE, 0, 0);
nb=atoi(rec_data);
if (nb==1) break;
}
if ((sortie==1)||(rec == -1)||(rec == 0))
{ if ((rec -1)||(rec 0)) PostMessage(Dlg2, WM_DECONNECTE, 0, 0);
break;
}
}
MessageBox(Dlg2,"Fin chat serveur",0,0);
CloseHandle(hthread);
return 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 ???
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
11 mai 2005 à 22:35
J'ai oublié un mot donc je réécris :
Je sais pas comment gérer plusieurs dans ma boucle.
Comme recv() est bloquant comment faire ???
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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 ?

Sinon pour contourner le recv() bloquant, soit il faut utiliser d'autres threads, soit il faut utiliser les sockets non bloquants..
Enfin je te conseille de le ce livre:
http://betouchi.free.fr/doc_et_ebook/prog_reseau/network2.chm
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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 ???
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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).
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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é ?
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 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 ???
0
Rejoignez-nous