Pergunta

Estou desenvolvendo uma aplicação em C #, usando o modelo cliente-servidor, onde o servidor envia uma matriz de bytes com um bitmap para o cliente, as cargas cliente-lo na tela, envia um "OK" para o servidor, e o servidor envia outra imagem, e assim por diante.

O comprimento das deppends buffer de imagem, geralmente, é entre 60kb e 90kb, mas eu vi que isso não importa. Se eu colocar o cliente eo servidor no mesmo computador, usando localhost, tudo funciona bem. O servidor faz BeginSend, eo cliente faz EndReceive e todo o buffer é transmitida.

No entanto, agora estou testando isso em uma rede sem fio eo que acontece é:

  • O servidor envia a imagem.
  • A função de retorno data_received no cliente é chamado, mas há apenas 1.460 bytes para ler (MTU -? Por que não deve ser apenas em UDP)
  • A função de retorno data_received no cliente é chamado novamente, agora com o resto do tampão (quer se trate de 1000 bytes ou 100 kbytes) ...

É sempre assim, um primeiro pacote com 1460 bytes é recebido, em seguida, o segundo pacote contém o resto.

Eu posso contornar este juntando ambas as matrizes de bytes recebidos, mas isso não parece certo. Eu nem tenho certeza que isso está acontecendo. É alguma restrição na rede? Por que então não C # espera para toda a dados a serem transmitidos? Quero dizer, é da TCP, eu não deveria ter que se preocupar com isso, certo?

De qualquer forma, qualquer ajuda seria ótimo!
Felicidades

Foi útil?

Solução

É de TCP - você deve tratar os dados como um fluxo . Você não deve se preocupar como o fluxo é dividido em pacotes, ou fazer suposições sobre isso.

Se você precisa receber um "bloco" única de dados, a maneira mais simples de fazer isso de forma confiável é prefixo com o comprimento (por exemplo, como um valor de 32 bits). Você lê o comprimento (observando que até mesmo os bytes pode ser dividida em vários pacotes) e, em seguida, repetidamente ler (se síncrona ou assíncrona) tomar nota de quanto você lê cada vez, até que você leu tudo os dados.

Outras dicas

Ter uma leitura de 9.2.4

Ao dissecar um protocolo de camada de aplicação que você não pode assumir que cada pacote TCP contém exatamente mensagem camada de uma aplicação. Um pedido de mensagem de camada pode ser dividido em vários pacotes TCP.

adicionando a resposta de John:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top