Pergunta

Nós estamos tendo um problema bizarro com Indy10 onde duas grandes cadeias (algumas centenas de caracteres cada) que enviamos para fora um após o outro usando TCP estão aparecendo na outra extremidade interligados de forma estranha. Isso acontece muito raramente.

Cada corda é uma mensagem XML completo encerrado com um LF e, em geral, o processo de leitura lê uma mensagem de XML inteiro, retornando quando se vê a LF.

A chamada para enviar a mensagem realmente é protegido por uma seção crítica em torno da chamada para o método writeln do IOHandler e por isso não é possível que dois threads para enviar ao mesmo tempo. (Temos certeza a seção crítica é implementado / funcionando corretamente). Este problema acontece muito raramente. Os sintomas são estranho ... quando enviamos corda A seguido por corda B o que recebemos no outro extremo (nas raras ocasiões em que têm insuficiência) é a seção à direita da corda A, por si só ( ie , há uma LF no final do mesmo), seguida pela secção líder de cadeia a e, em seguida, toda a cadeia B seguido por um único LF. Nós verificamos que o "expirou" propriedade não é verdade após a leitura parcial - nós registramos que a propriedade após cada leitura que o conteúdo retornos. Além disso, sabemos que não são incorporados LF caracteres na seqüência, como substituir explicitamente todos os caracteres não alfanuméricos na string com espaços antes anexando o LF e enviá-lo.

Temos mecanismos de registro dentro das seções críticas, tanto a transmissão e termina recebendo e para que possamos ver este comportamento no "fio".

Estamos completamente confuso e se perguntando (embora sempre o menor possibilidade) se poderia haver alguns problemas de Indy de baixo nível que podem causar este problema, ex , buffers sendo enviados na ordem errada. ... muito difícil de acreditar que este poderia ser o problema, mas estamos agarrando em palhas.

Alguém tem alguma idéia brilhante?

Foi útil?

Solução

Você tem vários segmentos de leitura do mesmo soquete ao mesmo tempo no fim de recepção? Mesmo apenas para consultar o status Conectado () faz uma leitura a ocorrer. Isso poderia fazer com que seus vários segmentos para ler os dados de entrada e armazená-lo no IOHandler.InputBuffer em ordem aleatória, se você não for cuidadoso.

Outras dicas

Você poderia tentar Wireshark para descobrir como os dados são tranferred. Desta forma, você pode descobrir se o problema está no servidor ou no cliente. Lembre-se também de usar TCP para se "garantido" dados válidos na ordem correta.

Você está usando TCP ou UDP? Se você estiver usando UDP, é possível (e esperado) que os pacotes UDP podem ser recebidos em uma ordem diferente do que eles foram transmitidos devido ao encaminhamento através da rede. Se este for o caso, você vai precisar adicionar algum tipo de pacote de ID para cada pacote UDP para que o receptor pode corretamente encomendar os pacotes.

Você verificou as href="http://en.wikipedia.org/wiki/Nagle%27s_algorithm" rel="nofollow noreferrer"> Nagle configurações do IOHandler? Tivemos um problema semelhante que nós corrigido pela definição UseNagle como falsa. No nosso caso, enviar e receber grandes quantidades de dados em rajadas foi lento devido a Nagle coalescente, por isso não é exatamente o mesmo que a sua situação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top