Indy tem limite caracteres?
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
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
Curtidas 0
Respostas
Massuda
03/04/2006
A princípio, não existe limite de caracteres. Como você está enviando e recebendo as mensagens?
GOSTEI 0
Rengaf
03/04/2006
Cliente
clienteIndy.WriteBuffer(varRecord, SizeOf(varRecord),True);
Servidor OnExecute
athread.connection.ReadBuffer(VarRecord, sizeof(VarRecord));
Obrigado pela atenção!!
clienteIndy.WriteBuffer(varRecord, SizeOf(varRecord),True);
Servidor OnExecute
athread.connection.ReadBuffer(VarRecord, sizeof(VarRecord));
Obrigado pela atenção!!
GOSTEI 0
Massuda
03/04/2006
Imagino que varRecord não seja uma string. Como você definiu esse tipo de dado (record, class, etc) e qual é a definição dele?
GOSTEI 0
Rengaf
03/04/2006
DadoMSG = record
TipoMSG :String;
ScriptMSG :String;
NumMSG :Smallint;
end;
VarRecord = DadosMSG;
:wink:
TipoMSG :String;
ScriptMSG :String;
NumMSG :Smallint;
end;
VarRecord = DadosMSG;
:wink:
GOSTEI 0
Massuda
03/04/2006
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......esta é a forma mais simples de entender, mas existem formas mais eficientes de fazer isso.
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;
GOSTEI 0