Newsgroup: it.comp.lang.delphi
Titolo: Tradurre da VB

Premetto che sono un discreto somaro in generale, ma che il seguente argomento non l'ho mai trattato prima e, nonostante ci stia sbattendo la testa da qualche giorno non ho raggiunto un risultato soddisfacente.
Descrivo il problema: devo tradurre in Delphi 2010 queste 4 righe in VB:
 
Private Sub Command1_Click()
 
Winsock1.Connect
 
End Sub
 
Private Sub Command2_Click()
Dim cmd As String
 
cmd = Text1.Text & Chr(0)
Winsock1.SendData (cmd)
 
End Sub
 
 
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data As String
 
Winsock1.GetData data, vbString
 
If (InStr(data, "LOGIN") > 0) Then
    Text2.Text = data
End If
 
End Sub
 
Chiaramente c'è tanto altro intorno, ma fondamentalmente non trovo il corrispondente del Winsock, sbaglio a cercarlo tra i componenti Indy?
A me basta qualcosa che come Winsock abbia un comando per inviare una stringa a un indirizzo IP e un evento che mi riporti le eventuali risposte.
 
Lo so, è facile, insultatemi pure ma poi datemi un aiutino.
 
Grazie e saluti.

TidTcpClient.
 
A

 A
 
E questo lo avevo indovinato allora. Riesco a connettermi ma non riesco a comunicare. Il idTcpClient1.SendCmd mi da sempre il Connection Closed Gracefully, mentre idTcpClient1.IOHandler.Write('....') non mi da risposte da parte del server, o forse non so come riceverla. Di seguito il tentativo che ho fatto:
 
procedure TForm1.FormCreate(Sender: TObject);
begin
idTcpClient1.Host:='10.0.0.150';
idTcpClient1.Port:=5001;
idTcpClient1.Connect;
 
// fino a qui tutto ok
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
str_in, risp: string;
begin
//  idTcpClient1.SendCmd('....' + chr(0),'OK');
  idTcpClient1.IOHandler.Write('....' + chr(0));
  try
    risp:=idTCPClient1.IOHandler.ReadString(255);  // si inchioda qui
  finally
    Memo1.Lines.Add(risp);
 
  end;
 
end;

     risp:=idTCPClient1.IOHandler.ReadString(255);  // si inchioda qui
 
Hai provato a vedere se è possibile fare il ReadString senza specificare la dimensione? (es. 255)
 
-- 
MARCO BREVEGLIERI 
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 Hai provato a vedere se è possibile fare il ReadString senza specificare la dimensione? (es. 255)
 
Giusta osservazione: il parametro è richiesto, ma provando ho notato che se metto 255 e la risposta è più breve è come se restasse in attesa dei bytes mancanti e quindi resta bloccato. Se metto 0 passa ma giustamente non ritorna nulla (speravo che fosse una sorta di carattere jolly invece no). 
Se metto una cifra bassa (più corta della risposta) ottengo i primi caratteri della risposta.
A questo punto: o conosco l'esatto numero dei caratteri da scaricare (tipo una proprietà come InBufferCount che però non trovo), o leggo carattere per carattere fino allo svuotamento? Ma ho paura che all'ultimo ciclo, quello in cui non mi deve restituire nulla, si blocchi come nel caso del 255.
Qualche suggerimento?

> Qualche suggerimento?
 
Hai gia' cercato nei vecchi post?
 
A.
 


Si, ma mi pare di capire che quello che devo fare io è dato per scontato, e le domande e risposte che trovo sono tutte di problemi più specifici e complessi.
Anyway per ora ho risolto così: visto che la comunicazione usa un protocollo determinato ad ogni mia richiesta so cosa aspettarmi come risposta, quindi vado a leggere il buffer fino a trovare l'end tag corrispondente alla mia domanda. E per ora ok.
Però andando avanti dovrò essere in grado di ricevere anche stringhe che non siano generate da una mia richiesta, e qui ho paura che avrò delle difficoltà. Ma andiamo avanti un passo alla volta.

 A questo punto: o conosco l'esatto numero dei caratteri da scaricare (tipo una proprietà come InBufferCount che però non trovo), o leggo carattere per carattere fino allo svuotamento? Ma ho paura che all'ultimo ciclo, quello in cui non mi deve restituire nulla, si blocchi come nel caso del 255.
 
Credo che il punto sia questo: se tu sai che la risposta coincide esattamente con una stringa di un numero precisato di caratteri, puoi specificare questa lunghezza e rimanere in attesa del dato; se non hai questa garanzia, dovrai leggere i singoli caratteri man mano che arrivano fino a quando non incontri il terminatore atteso (stabilito dal protocollo di comunicazione).
 
Ciao,
  Marco.


premetto che non ho mai usato la libreria indi preferendo l'ics di piette comunque dovresti guardare questo articolo
http://stackoverflow.com/questions/10881685/indy-tcp-read-data-in-a-loop
, ciao Brunello

 
 
Si, infatti è quello che ho fatto e per ora va bene.
Ma ti ripeto il dubbio che ho espresso nel post precedente: quando dovrò ricevere una stringa che non è conseguenza di una mia richiesta come potrò fare a riceverla? Se vado a testare il buffer periodicamente nel caso lo trovi vuoto mi si bloccherà il programma? L'unica cosa che mi viene in mente è che si possa settare un timeout. Sto ancora verificando.

 
http://stackoverflow.com/questions/10881685/indy-tcp-read-data-in-a-loop
, ciao Brunello
 
Grazie, vado a leggere.