|
Bas de page | |
---|---|
Auteur | Sujet : Sockets asynchrones en C sous Windows |
Publicité | Posté le 23-03-2009 à 16:46:53 |
xilebo noone | Une socket n'est ni synchrone ni asynchrone, c'est l'utilisation que tu en fais qui va l'être ou non.
|
Pat333 |
|
xilebo noone |
|
tomap | Pour un serveur qui permet de faire communiquer plusieurs clients (un chat instantané), vous me conseillez une utilisation synchrone (en mode bloquant) ou bien une utilisation asynchrone ? J'ai commencé à réaliser ça en mode synchrone en utilisant les threads au niveau du serveur (je crée un thread pour chaque client connecté), mais je trouve que comme ça il y aura beaucoup trop de threads lancé simultanément au niveau du serveur, et aussi y aura le problème de communication entre threads (quand on veux par exemple qu'un client envoi au autres clients connectés). Mais je me demande si avec tout ça, ça ne sera pas plus facile d'utiliser des sockets en mode non bloquant (asynchrone); Il parais qu'une utilisation asynchrone est plus difficile qu'une utilisation synchrone + threads. Vous en dite quoi ? En fait quand j'ai voulu utiliser les sockets en mode non bloquant j'ai suivi le schéma de serveur-multi-clients montré sur ce lien http://mapage.noos.fr/emdel/reseaux.htm , mais comment faire ensuite pour diminuer de nombre de threads grâce select() ? Parce qu'un thread par client connecté, c'est beaucoup.. Message édité par tomap le 24-03-2009 à 18:42:22 |
tomap |
Le schéma actuel (sans select) est le suivant: Message édité par tomap le 24-03-2009 à 19:45:37 |
tomap | Ok. Est ce que le mieux serai que la liste contenant les sockets client (valeurs int) soit une liste chainée, ou un tableau d'entier, ou ... ? Message cité 1 fois Message édité par tomap le 25-03-2009 à 19:41:54 |
Publicité | Posté le 25-03-2009 à 19:28:08 |
Emmanuel Delahaye C is a sharp tool |
--------------- Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/ |
xilebo noone | Sous windows, il faut initialiser la pile reseau en appelant WSAStartup() et WSACleanUup()
|
tomap | . Message édité par tomap le 26-03-2009 à 20:56:21 |
tomap | En fait j'utilise déjà WSAStartup() et WSACleanup() mais il y a quand même le problème que j'ai cité plus haut avec select() (elle me retoun -1) Message édité par tomap le 26-03-2009 à 22:23:24 |
xilebo noone | Dans ce cas, teste l'erreur avec WSAGetLastError() http://msdn.microsoft.com/en-us/li [...] S.85).aspx
|
tomap | WSAGetLastError() me retourne la valeur 10022
ça dois être parce que j'appelle FD_SET() avec le 1er argument qui est naturellement invalide vu que la liste est initialement vide (tete = NULL). Donc pour régler ça, dans ma boucle je teste si shared_list.tete != NULL, mais bon, ça va bouffer du CPU en bouclant quand il n y a aucun client connecté (liste vide càd tete=NULL) ...
Une autre question: est ce qu'il faut à chaque fois que je veux "lire" une valeur de la liste que j'utilise un mutex (lock/unlock) ? Ou alors ce n'est naicessaire que lors de l'écriture sur la liste (lors d'ajout/suppression...) ? EDIT: Message cité 1 fois Message édité par tomap le 26-03-2009 à 22:43:48 |
tpierron |
|
tomap | En fait avec cette méthode il y a un problème de conception.
|
tomap |
Sorry, j'ai posté sans voir ton message.
|
tpierron |
|
tomap |
|
tpierron |
|
tomap |
J'ai eu l'idée suivante: à chaque connexion d'un client j'envoie un message à moi même (127.0.0.1) via un scoket udp qui est permanent dans la tête de la liste (avec sendto()). Donc j'ai fait:
Message cité 1 fois Message édité par tomap le 27-03-2009 à 19:17:50 |
xilebo noone |
|
tomap | Je n'aimerai pas être limité par le nombre de threads et du coup limité le nombres de clients, on ne sais jamais, je veux prévoir ça dés le début. Sinon y a pas un autre moyen pour débloquer select() à partir du thread principale ? Message édité par tomap le 27-03-2009 à 20:59:05 |
tpierron | Rah, mais pourquoi te casses tu la tête avec une socket UDP ?
Message cité 1 fois Message édité par tpierron le 27-03-2009 à 21:26:08 |
tomap | Bon ok je vais faire comme ça alors.
Mais bon je pourrais aussi faire me simplifié la vie en créant un thread par client connecté et définir une limite maximal de clients connecté et mettre en place 2 ou 3 serveurs; si le 1er est à la limite du nombre de clients autorisé, on envoi une requête au client qui veux se connecter pour le redirigé au 2eme serveur et ainsi de suite... Je vais y réfléchir. Message édité par tomap le 27-03-2009 à 23:55:11 |
Publicité | Posté le |
Sujets relatifs | |
---|---|
Fonction C times en Ada. | [Débutant] Arret d'une boucle en C++ |
[AIDE SVP] Lancer projet C++ sur autre un ordinateur sans VS 2008 | [résolu][C] Strlen - erreur de segmentation |
[Visual C#] Problème projet après changement de PC | C, execution de sous programme [TERMINE] |
Programme C avec interface web | Transfert de fichier de windows vers linux |
Programmation C - DSP - MATLAB => CCS | |
Plus de sujets relatifs à : Sockets asynchrones en C sous Windows |