ClientSocketX Dynamique

Résolu
Signaler
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010
-
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010
-
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

Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
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
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

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.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
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
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

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 ....
Messages postés
93
Date d'inscription
mardi 11 avril 2006
Statut
Membre
Dernière intervention
4 mars 2009

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
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

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 @+
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

Bonjour WhiteHippo,

Je me demandais justement comment utiliser ce fameux Tag ?

Thanks !
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

WhiteHippo Win !

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

Merci !