Problème de connection TClientSocket (pour expert)

octavianus_1 Messages postés 9 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 juillet 2014 - 23 nov. 2006 à 21:23
octavianus_1 Messages postés 9 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 juillet 2014 - 18 déc. 2006 à 11:38
J'ai une application développée en Delphi7 qui utilise le composant
TClientSocket de Indy9 pour se connecter à un serveur sur lequel tourne
une application "Server" développée en Java. En cas de perte de
connexion avec son serveur courant, l'application "client" doit se
connecter automatiquement à un autre serveur défini dans une liste.


Cela fonctionne parfaitement avec des serveurs Windows. Dans le cas où
l'application "Server" tourne sur un serveur Unix, l'arrêt de
l'application "Server" entraîne un event "onDisconnect" qui démarre la
prise de connexion avec le prochain serveur de la liste (cela peut-être
un serveur Windows ou Unix). Mais là, contrairement à un serveur
Windows, la prise de connexion reste sans réponse: la commande
d'ouverture de la connexion est lancée sans aucun résultat en retour:
pas de connexion, pas d'erreur, pas de timeout...rien.


Il semble que le fait d'arrêter l'application "Server" sur un serveur
Windows ou Unix entraîne un comportement différent du composant
TClientSocket...


Est-ce que ce comportement a déjà été constaté par qqn?


Merci d'avance pour tout avis

4 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 nov. 2006 à 19:17
Après avoir galéré avec les composants Indy 9, et les connexions/deconnexions entre un serveur AS400 et un client Windows, et inversement, je te conseillerais d'utiliser tout simplement un TServerSocket et un TClientSocket (paquet dclsockets70).
Dans mon cas, en utilisant l'événement OnError du TClientSocket, les deconnexions du serveur ( ErrorEvent=eeDisconnect ) étaient alors toutes interceptées.

Cordialement.

<hr />Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
0
octavianus_1 Messages postés 9 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 juillet 2014
4 déc. 2006 à 11:46
Merci pour ta réponse WhiteHippo,


En fait, du côté client, j'utilise déjà un composant TClientSocket du
paquet dclsockets70.  Par contre, du côté serveur, il s'agit d'une
application dont je n'ai pas le contrôle.


Effectivement, les deconnexions du serveur sont interceptées
efficacement par l'event OnError. Mon problème est ailleurs et se
limite au cas où il y a deconnexion d'un serveur Unix:

1) Sur deconnexion du serveur unix, l'event OnError se déclenche

2) Mon TClientSocket récupère le prochain serveur listé et tente la
connexion (le nouveau serveur peut être du Unix ou du Windows)

3) Et là problème, la connexion ne se fait pas et aucun message
d'erreur d'aucune sorte ne peut être intercepté (ni par un event
OnError, ni par OnDisconnect)


Ce comportement n'arrive jamais avec un serveur Windows, on dirait
que  la perte de connexion avec un serveur Unix ne se fait pas
"proprement".  J'ai essayé,  à  la perte de connexion,
de détruire l'objet TClientSocket et d'en créer un nouveau pour la
connexion suivant...Toujours le même comportement...


Ma quête continue...
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
9 déc. 2006 à 13:46
Tu travailles en lecture/ecriture synchrone ou asynchrone ?  ctBlocking ou ctNonBlocking? Moi j'ai opté pour le ctNonBlocking associé à un timer qui toute les 5 secondes réessayait de se reconnecter. De plus sur une erreur eeDisconnect, fermeture obligatoire de la connexion.

Voici une portion de code allégée :

procedure TForm1.TimerConnexionSocketTimer(Sender: TObject);
begin
  Inc( FClientSocketNbTentatives ) ;
  ClientSocket .Open ;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
   TimerConnexionSocket.Enabled := FALSE;
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  TimerConnexionSocket.Enabled := TRUE ;
  FClientSocketNbTentatives    := 1 ;
end;

procedure TForm1.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  if ( ErrorEvent=eeDisconnect ) then
  begin
    ClientSocket .Close ;
    TimerConnexionSocket .Enabled := TRUE ;
  end ;
end;

Cordialement.





<hr />

Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
0
octavianus_1 Messages postés 9 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 juillet 2014
18 déc. 2006 à 11:38
Je travaille actuellement en asynchrone...Et je ne suis pas loin de
penser que mon problème vient de là (tu lances un essai de connexion et
une erreur peut être retournée plusieurs dizaines de secondes plus
tard, exemple: l'erreur 10060).


Ton idée d'avoir un timer qui essaie périodiquement la connexion est une approche envisageable, je vais essayer.


Autre solution envisageable que je vais certainement explorer lorsque
le reste du développement m'en laissera le temps: du multi-threading
avec un thread spécifique pour le socket fonctionnant en synchrone.


Merci encore pour tes inputs
0
Rejoignez-nous