Indy tem limite caracteres?

03/04/2006

Ola pessoal,

estou criando uma aplicação para troca mesangens com componentes Indy.

Quando envio mensagens com uns 1000 caracteres por exemplo, ela chega ao destino com apenas 50. como posso resolver isso??

Também gostaria de uma ajuda na troca arquivos usando componentes INDY.


obs.: Uso IdTCPServer+IdTCPClient


Rengaf

Respostas

03/04/2006

Massuda

A princípio, não existe limite de caracteres. Como você está enviando e recebendo as mensagens?


Responder Citar

03/04/2006

Rengaf

Cliente
clienteIndy.WriteBuffer(varRecord, SizeOf(varRecord),True);

Servidor OnExecute
athread.connection.ReadBuffer(VarRecord, sizeof(VarRecord));


Obrigado pela atenção!!


Responder Citar

03/04/2006

Massuda

Imagino que varRecord não seja uma string. Como você definiu esse tipo de dado (record, class, etc) e qual é a definição dele?


Responder Citar

03/04/2006

Rengaf

DadoMSG = record
TipoMSG :String;
ScriptMSG :String;
NumMSG :Smallint;
end;

VarRecord = DadosMSG;

:wink:


Responder Citar

03/04/2006

Massuda

Para entender porque seu record chega incompleto no destino, segue uma pequena explicação sobre strings & records...

A não ser que você esteja usando strings de tamanho fixo (tipo ShortString ou string[]), qualquer variável do tipo string é um ponteiro para uma área de memória onde está o texto da string.

Assim, se você põe 10 ou 10000000 caracteres na string VarRecord.ScriptMSG, o tamanho de VarRecord não muda, pois o texto da string VarRecord.ScriptMSG está em outra área de memória que não necessariamente inclui o VarRecord.

Para poder passar seu record de um programa para outro, você precisa transferir os textos das strings ao invés do ponteiros. Um jeito de fazer isso seria...
//Cliente 
clienteIndy.WriteLn(varRecord.TipoMSG); 
clienteIndy.WriteLn(varRecord.ScriptMSG); 
clienteIndy.WriteSmallInt(varRecord.NumMSG); 

//Servidor OnExecute 
VarRecord.TipoMSG := athread.connection.ReadLn;
VarRecord.ScriptMSG := athread.connection.ReadLn;
varRecord.NumMSG := athread.connection.ReadSmallInt;
...esta é a forma mais simples de entender, mas existem formas mais eficientes de fazer isso.


Responder Citar