ClientSocketX Dynamique

Résolu
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010 - 22 juin 2007 à 19:56
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010 - 23 juin 2007 à 12:20
Bonjour,

Je suis entrain de développer (just for the fun) un testeur de connexion Internet,
celui-ci utilise 2 TClientSocket créé dynamiquement par un system de array en type record :



var
TFunc: array of (un TClientSocket)

ensuite on a :

TFunc[I].Sock := TClientSocket.Create(mon form);
TFunc[I].Sock.Name := 'MS' + IntToStr(I);
TFunc[I].Sock.OnConnect := MSConnect;
TFunc[I].Sock.OnRead := MSRead;
TFunc[I].Sock.OnError := MSError;
TFunc[I].Sock.Tag  := I;
TFunc[I].Sock.Host  := Host;
TFunc[I].Sock.Port := Port;
TFunc[I].Sock.Open;

Sachant que MS est un TClientSocket sur mon form & que les Evénements OnConnect,
OnRead et OnError sont bien là.

Maintenant ma question est un peu complexe, accrochez vous ...

Dans l'evénement OnConnect j'envois au server une variable aléatoire.
Dans l'evénement OnRead je reçois l'information traité, mais seulement
je ne sais pas quel
TFunc[I].Sock

a envoyé la variable qui a permis le traitement,
car mon serveur ne peut me le révéler. Si quelqun a compris quelque chose à se que je viens de dire

Merci @ vous ...

8 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
23 juin 2007 à 11:53
Pfff c'est dur dur en ce moment  


Ton evenement OnRead dispose bien d'un sender !!! donc avec un  TClientSocket(Sender).tag tu dois retrouver le tag du socket qui a généré l'evenement. Non ?

Cordialement. <hr />"L'imagination est plus importante que le savoir." Albert Einstein
3
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
22 juin 2007 à 23:04
Bonsoir WhiteHippo,

J'ai été voir la source que tu m'as proposé, cependant elle ne peut hélasse m'aider car mes sockets sont dynamiques et de plus je n'ai pas acces au serveur.

Je peux donner plus de précisions si toutefois quelqun ne comprenais pas la question.

Merci pour cette suggestion rapide et à bientôt.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
22 juin 2007 à 23:32
Soit je ne comprends rien, soit il est vraiment très tard

Avec un TClientSocket, tu as un TCustomWinSocket transmis avec l'événement OnRead qui permet d'obtenir :
  les informations locales (LocalAddress, LocalHost, LocalPort)
  les informations distantes (RemoteAddress,RemoteHost, RemotePort).

Donc, mis à part si tu as mis les mêmes valeurs d'adresse et de port sur chacun de tes clients, tu devrais pouvoir les distinguer les uns des autres par ces propriétés.

Cordialement. <hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
23 juin 2007 à 00:28
Je suis toujours dessus, en effet tu as raison il existe les informations locales et distantes,
mais elles ne me sont d'aucune utilité car j'ai l'adresse du server, et l'adresse des deux clients créé dynamiquement sont les mêmes. se que je cherche à faire ne se trouve pas dans les informations relative aux adresses ip mais bien dans l'information proprement dite. Quand on envois deux informations successivement par une boucle for par exemple
on a :



for I := 1 to 100 do begin
   TFunc[I].Sock := TClientSocket.Create(mon form);
   TFunc[I].Sock.Name := 'MS' + IntToStr(I);
   TFunc[I].Sock.OnConnect := MSConnect;
   TFunc[I].Sock.OnRead := MSRead;
   TFunc[I].Sock.OnError := MSError;
   TFunc[I].Sock.Tag  := I;
   TFunc[I].Sock.Host  := Host;
   TFunc[I].Sock.Port := Port;
   TFunc[I].Sock.Open;
end;

ensuite on a dans l'evénement OnConnect (soit MSConnect;) :

Socket.SendText(ChaineAvecMaVariable);

et dans le OnRead (soit MSRead;) :

if (J'aiUnMotQuiDitOk) then c'est bon;

les sockets sont bien envoyés dans l'ordre 1 to 100
mais dans la réception il y a un décalage (normal puisque c'est distant)
on reçois donc les réponses dans le désordre.

J'aimerais donc différencier ou trouver un astuce pour dire que c'est ma variable qui est bien traité.

J'espère que c'est plus clair à présent merci ....
0

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

Posez votre question
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
23 juin 2007 à 09:13
Bonjour,

Si j'ai bien compris, tous les évènements OnRead pointent sur une même méthode. Donc quand tu reçois une information, tu ne sais pas à quel socket elle est liée.

Pourquoi ne ferais-tu pas un programme multithread, un thread étant associé à un socket. La mise en oeuvre ne doit pas être trop compliquée et je pense que cela pourrais répondre à ton problème. A condition toutefois que je l'ai bien compris.

Sylvain
0
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
23 juin 2007 à 12:02
Bonjour sylvunix,

Tu as bien cerné mon problème en effet, tous les évènements pointent vers une même "méthode". Le multithread est peut être la solution, je vais reformer mon code afin de voir si il est possible de gérer individuellement les "méthodes".

En tout cas, je ne manquerai pas de confirmer ta réponse si toutefois elle correspond.

Merci @+
0
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
23 juin 2007 à 12:07
Bonjour WhiteHippo,

Je me demandais justement comment utiliser ce fameux Tag ?

Thanks !
0
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
23 juin 2007 à 12:20
WhiteHippo Win !

C'est nikel, heureusement que tu es là sinon j'aurais refais le prog en multithread

Merci !
0
Rejoignez-nous