Newsgroup: it.comp.lang.delphi
Titolo: Domanda sui Sockets

Ciao a tutti
Sto provando a creare una piccola applicazione c/s che utilizza l'oggeto
TClientSocket di Delphi.
Mi servirebbe riuscire ad intercettare gli errori del socket in modo da
poterli gestire per conto mio.
Per fare questo ho inserito nell'evento OnError il mio codice stando attento
ad impostare la variabile ErrorCode a 0 per non far sollevare l'eccezione
verso l'esterno.
Per essere più chiaro ho un bottone con questo codice ...
  Client.Host := Edit1.Text;  // Prendo il nome dell'host da un TEdit
  Client.Open;
Nell'Evento di gestione degli errori OnError invece ...
  ShowMessage('Generato errore socket');
  ErrorCode := 0;
Quando mando in esecuzione e clicco il bottone di connessione, invece di
essere richiamata la procedura OnError mi viene generata un'eccezione del
tipo:
... 'Windows Socket error: (11001), on Api 'ASync LookUp' ...
Il problema sembrerebbe in fase di risoluzione del nome dell'Host ...
Perchè non viene chiamata la funzione OnError ?
Sbaglio Qualcosa io ?
Grazie per tutti quelli che sono arrivati a leggere fino a questo punto ...
Ciao
Dani

 Sbaglio Qualcosa io ?
no,  il problema e' che quei simpaticoni della borland hanno scritto il
codice con i piedi.
Se guardi il sorgente ScktComp.pas (che definisce TClientSocket e
TServerSocket) ti accorgi di svariate "magagne" che la borland ha
tralasciato (ho l'impressione che il sorgente non sia suo...).
Per esempio la funzione Open svolge 4 operazioni: creazione del socket,
risoluzione dell'host o dell'address,  risoluzione del servizio,
connessione.
Gia' con la prima partono male: se la creazione del socket non riuscisse
(cosa molto improbabile ma non si sa mai...) loro non fanno altro che
sollevare l'eccezione senza avvertire nessuno.
Proseguendo poi la risoluzione dell'host NON e' asincrona nonostante la
selezione del ClientType=ctNonBlocking !!!! e oltretutto in questa fase se
si verificasse un errore non lo verrebbe a sapere nessuno :(((
Ma il bello arriva qando si cerca di connettere il socket: in questa fase il
risultato dell'operazione winsock.connect viene dato in pasto ad una
funzione (CheckSocketResult) che non fa altro che controllare se una
variabile di tipo procedura e' assegnata e chiamarla, ora questa procedura
devi costruirla tu e assegnarla tramite la funzione SetErrorProc che accetta
come parametro una procedura del tipo TSocketErrorProc.
in pratica devi fare una cosa simile:
procedure MyErrorProc (ErrorCode: Integer);
begin
 showmessage ('errorino!!!');
end;
procedure TForm1.ConnectClick;
var vecchiaproc : TSocketErrorProc;
begin
  vecchiaproc := setErrorProc (MyErrorProc);
  clientsocket.open;
  setErrorProc (vecchiaproc);
end;
spero di essere stato utile.
ciao,
DOC
----------
Paolo 'DOC' Rosi
Lead programmer
DREAMWARE S.r.l. Multimedia Productions
Via Pascoli 19 - Centro J.F.Kennedy - 19124  La Spezia - ITALY
Tel. 
+39-0187-500968
 (pabx) - Fax: +39-187-516388
DREAMWARE  NORD-EST
Via Caneva 66/B - Gemona del Friuli - Udine - Italy
Tel. 
+39 0432 891189
   Fax 
+39 0432 971811
DREAMWARE CANADA
3-552 Church St.  - Toronto -  Ontario - M4Y 2E3 Canada
Tel. 
+1 416 922-0904
   Fax. 
+1 416 922 0362
http://www.dreamware.com
e-mail: 
d...@dreamware.com
, 
pr...@italy.dreamware.com
-------------------------------





Ciao a tutti
Sto provando a creare una piccola applicazione c/s che utilizza l'oggeto
TClientSocket di Delphi.
Mi servirebbe riuscire ad intercettare gli errori del socket in modo da
poterli gestire per conto mio.
Per fare questo ho inserito nell'evento OnError il mio codice stando attento
ad impostare la variabile ErrorCode a 0 per non far sollevare l'eccezione
verso l'esterno.
Per essere più chiaro ho un bottone con questo codice ...
  Client.Host := Edit1.Text;  // Prendo il nome dell'host da un TEdit
  Client.Open;
Nell'Evento di gestione degli errori OnError invece ...
  ShowMessage('Generato errore socket');
  ErrorCode := 0;
Quando mando in esecuzione e clicco il bottone di connessione, invece di
essere richiamata la procedura OnError mi viene generata un'eccezione del
tipo:
... 'Windows Socket error: (11001), on Api 'ASync LookUp' ...
Il problema sembrerebbe in fase di risoluzione del nome dell'Host ...
Perchè non viene chiamata la funzione OnError ?
Sbaglio Qualcosa io ?
Grazie per tutti quelli che sono arrivati a leggere fino a questo punto ...
Ciao
Dani

 (ho l'impressione che il sorgente non sia suo...).
Infatti mi pare proprio che non lo sia...
Ciao !            {MSX}

Ciao,

Spero che tu abbia compilato il programma....altrimenti potrebbe essere
normale una cosa
di questo tipo, dipende dai settaggi di Delphi.
Hai già provato mediante un blocco Try-Except?
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support