Socket - C++ - Programmation
Marsh Posté le 04-03-2004 à 18:38:53
Entre deux fautes d'orthographe ou de grammaire, on a du mal a comprendre ta question...
Marsh Posté le 04-03-2004 à 18:44:54
bin ca depend de ce que tu veux faire, du style que tu comptes adopter, du nombre max de clients, des limitations de l'os ...
Marsh Posté le 04-03-2004 à 18:56:50
Suisse a écrit : Salut ! Avant que je vous plonge dans mes questions quelle son les 2 meilleurs ! Car j'ai déja posser une question symilaire sur un autre forum mais il n'arretais pas de me dire que contre dire le choix des autres. |
J'ai rien compris
Marsh Posté le 04-03-2004 à 19:12:42
ReplyMarsh Posté le 04-03-2004 à 19:27:48
Citation : tu aurais du faire un sondage |
Je n'y avais pas pensé
Citation : bin ca depend de ce que tu veux faire, du style que tu comptes adopter, du nombre max de clients, des limitations de l'os ... |
Quelque chose comme un serveur ircd (pas exactement). Donc ~ 100 utilisateur simultané (se n'est pas la maximum )
L'os sous windows.
Est-ce que les MultiThread réponde a mes besion ?
Si oui , vous n'auriez pas un site (exemple comme documention) MultiThread, socket. Je cherche de mon coté mais ses temps si mon internet ne va pas très bien.
Marsh Posté le 04-03-2004 à 19:35:16
Suisse a écrit : |
Fais un effort, franchement tu es illisible
Marsh Posté le 04-03-2004 à 20:33:44
bin ca depend ... par exemple un serveur mysql utilise un thread par client, ca se comprend car chaque client va demander au thread des choses 'lourdes' j'entends par la des choses couteuses en CPU.
j'ai regardé la source d'un unrealircd, ils font pas un thread par client, ca serait désastreux car on pourrait atteindre la limite de l'os, et inutile car la plupart des threads passerait leur temps a attendre ...
Marsh Posté le 04-03-2004 à 21:10:06
Citation : Fais un effort, franchement tu es illisible |
Désoler Pour expliquer sur les forums ses pas mon trucs.
Citation : et inutile car la plupart des threads passerait leur temps a attendre ... |
A oui tu a raison.
Donc si je crois ce que j'ai déjà lus.
Select : est très utilise pour la portabilité.
WSAAsyncSelect : Pour windows.
Alors voilà une dernière question après vous n'aurez plus a décrypter ce que j'écrie .
J'essai de faire un serveur en mode W32. Le problème est que je n'arrive pas a recevoir le recv() quand quelqu'un le déclanche (j'utilise WSAAsyncSelect) car je ne sais pas quelle est le bon accept();.
INFO : sauf si je me trompe le 1er paramètre de recv est le SOCKET accept().
Merci d'avance
En espérant plus trop vous déranger.
Suisse
Marsh Posté le 05-03-2004 à 01:11:44
a mon humble avis la fonction select (ou l'équivalent WSA) est totalement indispensable à tout programme client/serveur utilisant les socket.
faire un appel a recv, send, ou autres sans savoir si qqchose se trouve dans la socket (et donc si l'appel sera bloquant ou pas) c'est totalement aberrant, surtout dans
sinon chuis entièrement d'accord avec BlackGoddess :
il y a 1 seule chose a prendre en compte : les temps de traitements (ie l'analyse des requêtes, la construction des réponses, etc) sont-ils négligeables ?
si oui, tu peux te permettre de tout faire dans le meme thread : recevoir les données, les analyser, construire la réponse, et les envoyer.
si non, il faut faire un thread en plus, qui va se charger des traitements et laisser tranquille le thread socket qui se charge de recevoir et/ou envoyer.
Marsh Posté le 05-03-2004 à 02:40:40
Merci de cette description
Mais comme je ne suis pas encore très bon dans le c++ j'aimerais mieux laisser de coté les thread .
Sinon pas question est plus haute
RAPELLE : Le serveur n'est pas un client/serveur
Merci d'avance
Suisse
Marsh Posté le 09-03-2004 à 01:23:46
Je ne voudrais pas qu'on m'oublie :s
Citation : J'essai de faire un serveur en mode W32. Le problème est que je n'arrive pas a recevoir le recv() quand quelqu'un le déclanche (j'utilise WSAAsyncSelect) car je ne sais pas quelle est le bon accept();. |
Marsh Posté le 09-03-2004 à 02:28:05
Suisse a écrit : Je ne voudrais pas qu'on m'oublie :s
|
ben perso quand je lis des trucs comme ça je préfère oublier de suite la vie...
primo : faut bien 12 lectures pour commencer a entrevoir de quoi tu parles.
deuxio : c'est quoi la question ?
chais pas... poste le bout de code ou tu penses que ca rate (pas 2000 lignes de code)
et pour ton 'info', oui, la socket renvoyée par le accept() est celle qu'il faut passer a recv() pour recevoir des données sur celle-ci. (ca parait logique)
Marsh Posté le 09-03-2004 à 09:43:40
Suisse a écrit : RAPELLE : Le serveur n'est pas un client/serveur |
euh ... non c'est sur, mais c'est bien dans le cadre d'un développement client/serveur non ?
Suisse a écrit : |
Marsh Posté le 10-03-2004 à 02:07:44
Heu je ne suis pas sure de ce que tu veut dire mais, mon serveur N'EST PAS a même mon client
Et l'autre citation que tu a écrie, je veut faire en quelque sorte un ircd mais avec beaucoup moin de chose
++
Suisse
Marsh Posté le 10-03-2004 à 20:12:32
Rassures nous, le français n'est pas ta langue maternelle?
Cordialement,
xter.
Marsh Posté le 11-03-2004 à 00:46:56
Oui _-_ mais pas français de france ...
Mais pourtant ma question est simple a comprendre !
Marsh Posté le 11-03-2004 à 08:48:40
Bah nan, on a beaucoup de mal à déchiffrer le message ...
Marsh Posté le 11-03-2004 à 23:50:25
Ok vais essayer autrement en example...
Par exemple je suis une centrale téléphonique.
Par exemple Cricri_ tu m'apelle.
La je répond et je note ton # de teléphone (acc = accept()
Donc si tu veut me parlé pas de problème veut que j'ai ton # (recv(#tel)
mais si quelqu'un d'autre me téléphone j'efface ton # de teléphone par le nouveau. Donc si tu essai de me parlé ton # n'est pas dans ma liste et je ne t'écoute / parle plus, mais si l'autre me parle pas de problème !
Vous comprenez mieux maintenant :s ?
Marsh Posté le 12-03-2004 à 00:27:10
donc la dans ton proj ("Quelque chose comme un serveur ircd" ), tu ne sais pas comment gérer plusieurs connexions simultanées ?
ton proj marche quand 1 connexion se fait, mais ne fait plus ce qu'il faut avec plusieurs clients, et tu voudrais savoir comment faire pour supporter plusieurs connexions ?
(je confirme ta demande avant de tenter de répondre)
Marsh Posté le 12-03-2004 à 00:37:10
Tu a tout compris
Si tu est capable de lire ce qui sui répond, sinon oublie cela (tu va surement me répéter un peut le même principe).
Je ne sais plus ou j'ai lu cela mais, il parrais que je dois utiliser les struc (ou class mais je me trompe toujours et je ne sais quelle est le bon)
Quand un utilisateur se connecte j'ajoute la variable que accept() retourne dans cette struc.
Mais mon gros problème est que quand quelqu'un déclanche le FD_READ je dois chercher avec une variable (ou HANDLE) X (je la connais pas) dans la struc afin d'y retrouvé le bon accept()
Merci encore de bien vouloir "dé-crypter" mes messages québecois.
Suisse
Marsh Posté le 12-03-2004 à 01:12:32
pour te donner un exemple (ou plutot un cours, mais bon...)
accept te retourne une variable de type SOCKET, pour te dire que la connexion a été acceptée. c'est sur cette socket que tu peux faire des opérations du type recv ou send (en passant la socket comme 1er argument de ces fonctions).
pour gérer plusieurs connexions tu as donc principalement 2 méthodes :
- faire 1 thread par connexion. chaque thread s'occupe de sa connexion (de sa SOCKET), et fait des recv/send uniquement sur celle-ci. Par exemple après un accept(), tu crées 1 thread en lui passant la socket nouvellement créée.
- 1 thread qui s'occupe de toutes les connexions. ca se fait en utilisant select(), qui utilise une ou des variables de type fd_set, et qq macros du type FD_ZERO, FD_SET, FD_ISSET, etc. ca permet de s'occuper de plusieurs connexions dans le meme thread (solution idéale pour nb de connexions > 100).
sinon j'ai rien compris a la fin de ton message.
poste un bout de code, surtout sur la partie avec ta struct/classe (en esperant que ton code n'est pas a l'image de ta parlance)
Marsh Posté le 12-03-2004 à 02:24:51
Citation : accept te retourne une variable de type SOCKET, pour te dire que la connexion a été acceptée. c'est sur cette socket que tu peux faire des opérations du type recv ou send (en passant la socket comme 1er argument de ces fonctions). |
Là tu ne m'apprend rien
Je vais essayer d'utiliser les thread et select (tu ma un peut plus éclairsi ) sinon pour mon struct/classe j'était coissé, mais les thread devrais réglé ceci.
Sinon pourrais tu écrire un exemple : -créer un thread
- thread pour le recv()
(seulement au cas ou je ne réussi pas a le faire marché)
Encore merci !
Suisse
Marsh Posté le 12-03-2004 à 04:02:05
je vais pas non plus te faire tout ton prog faut pas abuser...
avec les qq exemples ci dessous et un minimum de compréhension des sockets, tu devrais etre capable de faire un truc basique qui marche a peu près.
créer un thread :
Code :
|
le select :
http://forum.hardware.fr/hardwaref [...] 7086-1.htm
Marsh Posté le 12-03-2004 à 13:15:53
[citation]je vais pas non plus te faire tout ton prog faut pas abuser... [/citation]
Je suis d'accord avec toi
Sinon je continue a passer des nuit blanche pour que sa marche
Encore merci ^^
Suisse
Marsh Posté le 04-03-2004 à 03:46:06
Salut ! Avant que je vous plonge dans mes questions quelle son les 2 meilleurs ! Car j'ai déja posser une question symilaire sur un autre forum mais il n'arretais pas de me dire que contre dire le choix des autres.
Les choix est :
WSAAsyncSelect
MultiThread
Select
Merci d'avance
Suisse
Message édité par Suisse le 04-03-2004 à 18:04:26