Newsgroup: it.comp.lang.delphi
Titolo: Indy verso CF

Salve al gruppo,
sto incontrando grosse difficoltï¿œ nello sviluppo di un progetto che 
mette in comunicazione un TCPServer Indy (versione Delphi 2007) e dei 
client Windows Mobile che utilizzano il CF 2.0. Qualcuno ha giï¿œ avuto 
esperienza del caso o vuole partecipare per trovare una soluzione ?
Il problema ï¿œ questo: dopo aver stabilito la connessione avvio una 
sequenza di lettura/scrittura client/server per farmi restituire dati 
dal server ma durante la lettura X il client non legge i dati richiesti 
per quella stessa ma dati precedenti. Piccolo esempio:
Client:
	Ci sei ?
Server:	
	ACK
Client:
	Inviami 10Kb di dati a caso.
Server:
	Eccoli
Client:
	qui dovrebbe ricevere i 10Kb
Client:
	ok ho finito ciao.
Server:
	ACK
Client:
	qui assieme all'ack espone una parte dei dati ricevuti prima.
Ho giï¿œ provato a cancellare i buffer prima di andare avanti nella 
comunicazione ma ï¿œ come se l'uno non capisse quanti dati deve ricevere 
realmente che siano tanti o pochi.
Sapete se vi sono differenze particolari di implementazione del proto 
TCP nel CF e nelle Indy ? perchï¿œ non vedo altro motivo.
Grazie per l'aiuto in anticipo.
Dani

 TCP nel CF e nelle Indy ? perch non vedo altro motivo.
A.

 tramite un TidTcpClient tenta di fare la stessa cosa.
Gi� fatto naturalmente e delphi-delphi funziona a meraviglia senza 
sbagliare un colpo.
Allego qui il codice lato server e lato client
Delphi 2007 code SERVER:
E il solo evento OnExecute ad inviare al client
mentre nel Connect e Disconnect non viene inviato nulla ma vengono 
utilizzati per loggare la connessione disconnessione del client.
//questa � la porzione di codice che lavora attualmente
   else if LeftStr(ms,4) = 'f1le' then begin
     Memo1.Lines.Add('Il client ha richiesto "'+CBFile.Text+'"');//mi 
permette di selezionare file con quantit� e dati differenti.
     FileStream.LoadFromFile(ExtractFilePath(ParamStr(0))+CBFile.Text);
     AContext.Connection.IOHandler.Write(FileStream.Text);//il Write 
accoda i caratteri #13#10 automaticamente
     Memo1.Lines.Add('"'+CBFile.Text+'" gli � stato inviato:');
     Memo1.Lines.Add('Inviati bytes:'+IntToStr(Length(FileStream.Text)));
     FileStream.Free;
   end
In particolare il timeout � impostato a 10000 e la propriet� reuseSocket 
  � settata su rsOSDependent.
Lato client sul palmare iPaq 214 Windows Mobile Classic con CF 2 
installato e compilato con VS2005:
char ch = ' ';
byte[] myReadBuffer;
StringBuilder pacchetto = new StringBuilder();
IPAddress serverIP = IPAddress.Parse(txtHost.Text);
TcpClient client = new TcpClient();
client.NoDelay = false;//provato anche true
client.Connect(new IPEndPoint(serverIP, Convert.ToInt16(txtPort.Text)));
//connessione effettuata
//NetworkStream strm = client.GetStream();
//NetworkStream strm = new NetworkStream(client.Client);
NetworkStream writer = new NetworkStream(client.Client);
//questa � una delle modalit� di lettura provate
/*byte[] bytes = new byte[8192];
//strm.Read(bytes, 0, (int)client.ReceiveBufferSize);
strm.Read(bytes, 0, 8192);
response = Encoding.ASCII.GetString(bytes, 0, bytes.Length);*/
System.Text.Encoding enc = System.Text.Encoding.ASCII;
byte[] bytes = enc.GetBytes("f1le\r\n");
writer.Write(bytes, 0, bytes.Length);
writer.Flush();
//Ho appena richiesto il file al server fin qui tutto bene.
//di seguito ci sono diverse modalit� di lettura
NetworkStream strm = client.GetStream();
myReadBuffer = new byte[16384];
//--------------------------
//strm = client.GetStream();
do
{
myReadBuffer.Initialize();
strm.Read(myReadBuffer, 0, myReadBuffer.Length);
pacchetto.Append(Encoding.UTF7.GetString(myReadBuffer, 0, 
myReadBuffer.Length));
//response = response + Encoding.ASCII.GetString(myReadBuffer, 0, 
myReadBuffer.Length);
}
//while (client.Client.Available == 0);
while (client.GetStream().DataAvailable);//prova altro.
//while (strm.DataAvailable) ;//prova altro.
myReadBuffer = null;
/*while (!client.GetStream().DataAvailable)
{ }
lunghezzamessaggio = client.Client.Available;
myReadBuffer = new byte[lunghezzamessaggio];
strm.Read(myReadBuffer, 0, myReadBuffer.Length);
response = Encoding.ASCII.GetString(myReadBuffer, 0, myReadBuffer.Length);
myReadBuffer = null;*/
/*while (client.Client.Available == 0)
{ }
lunghezzamessaggio = client.Client.Available;
myReadBuffer = new byte[client.ReceiveBufferSize];
strm.Read(myReadBuffer, 0, client.ReceiveBufferSize);
response = Encoding.ASCII.GetString(myReadBuffer, 0, lunghezzamessaggio);*/
myReadBuffer = null;
txtRX.Text += "1. HO RICEVUTO " + pacchetto.ToString().Length.ToString() 
+ "\r\n"; // qui mi segna sempre la dimensione del buffer e non quanti 
byte ha realmente ricevuto.
pacchetto = null;
strm.Close();
writer.Close();
client.Close();
Se avete la pazienza di darci un occhio ...
Dani

 Se avete la pazienza di darci un occhio ...
Il codice sorgente, soprattutto quello in C#, non č molto leggibile qui.
Ad ogni modo, mi č parso di capire che tu utilizzi un encoding sul 
client CF (UTF7)... sei sicuro che sia lo stesso utilizzato dal server 
Delphi?
In generale, toglierei un po' di codice commentato e farei un po' di 
pulizia nella tua applicazione, cosě da avere piů chiare le parti 
commentate, o comunque cercherei di affrontare i problemi del colloquio 
tra le due applicazioni "per gradi", magari predisponendo dei test 
graduali, cosě da verificare che la comunicazione avvenga nel modo 
corretto aggiungendo man mano le informazioni da scambiare tra le due 
applicazioni.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 applicazioni.
Sono partito da una comunicazione molto semplice per poi arrivare qui e 
fermarmi. Ma ti dico di più ho fatto un test con un server scritto in C# 
e il problema è il medesimo per cui penso che il problema sia lato 
palmare e CF. Ora sto parlando di questo nel forum C# vediamo cosa esce. 
Cmq non pare che gli MVP siano molto entusiasti del CF qualsivoglia 
versione.

 Delphi?
In realtà ho notato che non vengono letti correttamente i caratteri '€' 
e '+' ... devo cambiare codifica.