begin process at 2012 05 30 17:25:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Socket (serveur)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Socket (serveur)

dimanche 19 février 2006 à 11:10:54 | Socket (serveur)

yoyo269

Membre Club
Bonjour à tous (et toutes j'espère),
je suis en train d'essayer de faire un serveur de chat avec plusieurs utilisateurs.
Donc pour cela il me faut de nombreuses connexions.
C'est pour ça que je voudrais savoir s'il est possible d'avoir plusieurs connexions sur un même port (en TCP donc).
Si non, comment pourai-je m'y prendre (juste le concept, pour le code je me débrouillerai) pour arriver à gérer un grand nombre d'utilisateurs comme le fait le serveur de MSN par exemple.
Merci d'avance pour votre réponse.

YOYO, @+.
YOYO
dimanche 19 février 2006 à 11:29:21 | Re : Socket (serveur)

platon179

Membre Club
Réponse acceptée !
Salut :)

Tu peux en effet avoir plusieurs connections sur le même port, il n'y a aucun souci...
Sinon, pour un grand nombre d'utilisateurs, je pense qu'un serveur parallèle serait le plus adapté. Mais attention : dans ce cas, il te faudra vraiment beaucoup de RAM. Le principe est simple : lorsqu'un client se connecte, tu créées un nouveau processus, qui va gérer ce client et, des que le client se déconnecte, le processus se termine. Tu auras donc un processus principal qui va gérer les nouvelles connections de clients, et qui va créer des fils, un par client.

Si tu utilises un serveur itératif (un seul processus qui gère tous les clients), si tu as beaucoup de connections, les temps de latence risquent d'être plus élevés à mon avis...

Bonne journée @+
dimanche 19 février 2006 à 11:39:06 | Re : Socket (serveur)

yoyo269

Membre Club
Ok merci bcp platon. Tu peux pas savoir comme ça me rassure!!!
Ya juste une petite chose.Quand tu parles de processus, tu veux dire un thread?
Parce que voilà ce que j'ai fait pour l'instant quand une demande de connexion se fait et on dirait que ça déconne :

/*========= Demande de connexion ========*/
void DemandeConnexion()
{
    SOCKET TempSockConv;
    int Taille, i = 0;
    while(Connected[i] != 0 && i < 100) i++;
    if(i == 100)
    {
        SendMessage(ListBoxhWnd[1], LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Nombre de connexions maximum atteint !!!");
        SendMessage(ListBoxhWnd[1], LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Connexion refusée !");
    }
    else
    {
        closesocket(TempSockConv);
        Taille = sizeof(PortConv);
        TempSockConv = accept(SockConv[i], (SOCKADDR *) &PortConv, &Taille);
        shutdown(SockConv[i], SD_SEND);
        closesocket(SockConv[i]);
        SockConv[i] = TempSockConv;
        closesocket(TempSockConv);
        Connected[i] = 1;
        SockConv[i + 1] = CreerSocket(FenetrehWnd);
        Ecouter(i + 1);
        i = 0;
    }
}
La première connexion est acceptée sans pb, mais quand je demande à un autre socket d'écouter sur le port où la connexion a été faite, ça veut pas écouter.
Est-ce que tu as une idée?

YOYO, @+.
YOYO
dimanche 19 février 2006 à 11:41:46 | Re : Socket (serveur)

yoyo269

Membre Club
Pardon sans le "closesocket(TempSockConv);" sinon ça coupe la connexion tout de suite.LOL

YOYO, @+.
YOYO
dimanche 19 février 2006 à 12:01:58 | Re : Socket (serveur)

MrdJack

Réponse acceptée !
perso, je pense qu'il est plus pratique de garder le socket en écoute sur le port, et quand ya une demande de connexion, tu crées un nouveau socket qui va apres etre initialisé, accepter la connexion demandée sur le socket d'ecoute. comme cela, ca ne pose plus le probleme d'avoir le port deja utilisé lors de la mise en listen du socket d'ecoute.

bref, si tu veux que ca soit tres performant, je te conseille de créer lors d'une demande de connexion un thread par connexion acceptée en donnant en parametre l'iddentifiant de la connexion a accepter, puis de rentrer dans une boucle infinie qui se termine uniquement si la connexion est coupée.


dimanche 19 février 2006 à 12:04:40 | Re : Socket (serveur)

yoyo269

Membre Club
Merci à vous deux.
Grâce à vous je pense que j'ai de quoi faire maintenant.
J'essaye tout ça et je vous tiens au courant.

YOYO, @+.
YOYO
dimanche 19 février 2006 à 16:34:36 | Re : Socket (serveur)

aardman

Membre Club
Salut,
1 thread par client, c'est peut etre performant sous linux, mais c'est loin d'etre le cas sous windows.
Moi je te conseille plutot d'utiliser les socket asynchrones, cad WSAAsyncSelect() ou WSAEventSelect().

dimanche 19 février 2006 à 16:43:06 | Re : Socket (serveur)

yoyo269

Membre Club
Tu veux dire exploiter les événements FD_CLOSE, FD_READ etc... ?

YOYO, @+.
YOYO
dimanche 19 février 2006 à 18:11:54 | Re : Socket (serveur)
dimanche 19 février 2006 à 19:16:08 | Re : Socket (serveur)

yoyo269

Membre Club
Ok mais ça risque pas d'avoir du mal avec un transfert de fichier ?

YOYO, @+.
YOYO

1 2

Cette discussion est classée dans : serveur, utilisateurs, yoyo, socket, connexions


Répondre à ce message

Sujets en rapport avec ce message

Serveur Vc++6 pb dans recv [ par alfred ] Salut a tousJ'ai un probleme dans mon serveur et je ne sais pas comment le resoudre. Le client se connecte bien et envoie le bon nombre de caracteres sockets: méthode accept() [ par julien20vt ] Voila,je viens de coder le serveur de ma socket et ce qui me parait etrange c'est que la méthode accept() n'est pas bloquante, je pensais que le serve encore mon serveur [ par skysee ] bonjour,je suis toujours avec mon serveur en c sous visual c++ sous windows(sis eulement j'avais linux).Le problème est que je n'ai pas d'erreur de co Réception de données sur socket. [ par julien20vt ] Bonjour,J'ai un doute concernant l'utilisation de sockets.Si coté serveur j'utilise un buffer de taille X pour lire sur ma socket, ce serveur reste en Problème d'envoie par socket [ par CyberP ] J'ai fait un programme qui se connecte à un serveur ftp (le serveur ftp est aussi sur mon ordi). Je me connecte avec la fonction connect() et je recoi Tutorial - Socket, serveur, client BCPP + GUI [ par NyxArm ] Bonjours tout le monde, je suis présentement en période d'appretissage du language CPP sur Borland(v.6). Maintenant que j'ai acquis quelque conna socket et fichiers textes : HELP !! [ par ben01n ] Salut tout le monde !je prog actuellement un client serveur en udp multicast sous linux (voir source sur ce site) et j'aimerais que mon serveur envoi bind bought bought lier [ par JoebarGlut ] Salut, j'ai un piti problem de bind, kelkun peut il m'eclairer ?j'explik : (c'est un client qui se metamorphose en serveur ou en client suivant ce qu' socket [ par flatou ] salutvoila le code du serveur sous dos que j'ai fait :#include #include #include #pragma comment(lib, "ws2_32.lib")SOCKET s;SOCKET c;SOCKET result;soc pb connetion reseau multiutilisateurs [ par JRB ] lorsque l'on veut creer une connection reseau ou plusieurs clients peuvent se connecter sur le meme serveur, est ce que le serveur doit creer un socke


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales