Newsgroup: it.comp.lang.delphi
Titolo: d7e - indy 9.00.10 e IBM Clientaccess

Un saluto a tutti.
 
Lato client:
app delphi7 che usa un TidIcmpClient ed un TidTcpClient
 
lato server
servizio win32 che sta in ascolto su una porta socket con un
TidTcpServer.
 
Bene, sui client di un cliente, una delle due cose manda in freeze gli
applicativi.
Purtroppo non riesco ad avere un dato certo, ma credo sia il
TidTcpClient...
Questa cosa ovviamente presso altr clienti non succede...
Facendo le solite verifiche, ho scoperto che sui client e' installato
il kaz di clientaccess di IBM.
Questo cliente, infatti, una app che gira su as400....
Scoperta sta cosa, ho chiesto al loro sistemista se aveva un pc senza
il clientaccess installato.
E magicamete, su questo pc tutto funziona regolarmente.
 
La cosa simpatica e' che la app lato client apre anche altri socket
usando pero' i vecchi TClientSocket e TServerSocket..E questi socket
non fanno alcun problema.
 
Giusto per chi non so sapesse, questi 2 cosi lavorano in modo
ASincrono, menre gli indy lavorano in modo Sincrono...
 
E'  mia intenzione installare il clientaccess qui, su una macchina
virtuale, per fare 2 prove....
 
La domanda e': qualcuno sa niente di eventuali incompatibilita tra
indy e il clientaccess?
 
Ho provato con google ma l'unico riferimento che ho trovato simile al
mio problema e' relativo ad una connessione FTP con un server FTP che
gira su as/400...
 
 
Grazie per ogni eventuale risposta.
 
A.
 
 
 
 

 indy e il clientaccess?
 
Sono "pezzi" di software talmente diversi che mi sento quasi di escludere una eventuale incompatibilità tra i due.
 
Piuttosto, non è che magari si litigano in qualche modo una porta, o qualcosa del genere.
 
Eventualmente aggiungi al tuo programma un minimo di logging, giusto per capire qual è il punto esatto (o avvicinarci ad esso) in cui si blocca.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 Eventualmente aggiungi al tuo programma un minimo di logging, giusto per capire qual è il punto esatto (o avvicinarci ad esso) in cui si blocca.
 
 
Ho una classe che apre il socket e, in caso di successo, manda i dati.
Questo e' il metodo connect:
 
 
function TX.Connect(): integer;
var
  TryCount: integer;
  BaseLog: string;
 
begin
  Result := OLERROR_UNDEFINEDSTATE;
 
  BaseLog := PreparedClassName + '.Connect';
  WriteFrameworkEnterOnLog(BaseLog);
 
 
  try
    try
      if PortNumber < 0 then
      begin
        WriteErrorOnLog(BaseLog + ' invalid port number: ' +
IntToStr(PortNumber));
        exit;
      end;
 
      TryCount := 0;
 
 
      FIndyObject.Disconnect();
      if (FIndyObject.Port <> Self.PortNumber)
         or
         (FIndyObject.Host <> Self.Server) then
      begin
        FIndyObject.Port := Self.PortNumber;
        FIndyObject.Host := Self.Server;
        FIndyObject.BoundIP := LocalIp;
      end;
 
      while true do
      begin
        try
          FIndyObject.Connect(Self.ConnectionTimeout);
          Result := OLERROR_NOERROR;
 
        except
          On E:EIdAlreadyConnected do
          begin
            Result := OLERROR_NOERROR;
          end;
 
          On E:EIdSocketerror do
          begin
            Inc(TryCount);
            WriteExceptionOnLog(E, BaseLog, ' connect indy error:' +
IntToStr(E.LastError));
            FErrors.Add(E.ClassName + ' ' + E.Message + ' error code:'
+ IntToStr(E.LastError));
          end;
 
          On E:Exception do
          begin
            Inc(TryCount);
            FErrors.Add(E.ClassName + ' ' + E.Message);
            WriteExceptionOnLog(E, BaseLog, ' connect ');
          end;
        end;
 
        if (Result = 0) or (TryCount > Self.MaxTryCount) then
        begin
          break;
        end;
      end;
 
    except
      on E:Exception do
      begin
        FErrors.Add(E.ClassName + ' ' + E.Message);
        WriteExceptionOnLog(E, BaseLog);
      end;
    end;
 
  finally
    WriteFrameworkExitOnLog(BaseLog);
  end;
end;
 
 
Lui fa questo:
 
....
      try
        Result := Connect();
 
      except
        on E:Exception do
        begin
          WriteExceptionOnLog(E, BaseLog, 'Connect');
          FErrors.Add(E.ClassName + ' ' + E.Message);
          Result := OLERROR_UNDEFINEDSTATE;
        end;
      end;
 
      if (Result <> OLERROR_NOERROR) then
      begin
        exit;
      end;
 
      try
        FIndyObject.WriteCardinal(RequestSize);
        FIndyObject.WriteStream(ARequest.RequestAsStream);
        Result := OLERROR_NOERROR;
 
      except
        on E:EIdSocketError do
        begin
          WriteExceptionOnLog(E, BaseLog, 'Connect -  indy error
code:' + IntToStr(E.LastError));
          FErrors.Add(E.ClassName + ' ' + E.Message + ' error code=' +
IntToStr(E.LastError));
          Result := OLERROR_UNDEFINEDSTATE;
        end;
 
        on E:Exception do
        begin
          FErrors.Add(E.ClassName + ' ' + E.Message);
          WriteExceptionOnLog(E, BaseLog, 'Connect');
          Result := OLERROR_UNDEFINEDSTATE;
        end;
      end;
 
...
 
Ho guardato meglio i log.
Il socket lo apre...Lui entra in connect ed esce senza segnalare
eccezioni...
Dopo, appena tenta di scrivere con i metodi Writexxxx, si freeza....
Nota che non ho mai usato il TidFreeze....Magari ho sempre avuto culo,
ma fino ad oggi non ne ho mai avuto bisogno.... :-D
 
A.

un problema ad accedere a tabelle su sqlserver tramite ado l'ho avuto
parecchi anni fa su macchine su cui era installato clientaccess, pero'
dopo un aggiornamento della versione installata il problema si e'
risolto.


Aggiornamento della versione installata di COSA? :-D
 
A.
 
 

> Aggiornamento della versione installata di COSA? :-D
 
scusa, l'aggiornamento era del clientaccess, ora in quanto non più
utilizzato l'ho rimosso dal mio computer e non so dirti la versione,
ciao Brunello


Ok. Grazie!
 
A.

 A.
 
che versione usi al momento di cliaccess?