Envio de bytes com erros(Sockets)

3 respostas
B

Bom dia a todos.

Estou com um probleminha.

Estou fazendo uma aplicação para envio de arquivos entre cliente e servidor. O usuario tem a opção de escolher de quantos em quantos bytes o arquivo sera enviado para servidor, por ex:
Um arquivo de 5 mb, se o usuario colocar la para enviar de 1.000 bytes, ele sera enviado em arrays de 1.000 em 1.000 bytes e no servidor ele junta tudo e cria o arquivo novamente.

Só que ta acontecendo um erro comigo, quando mando ele enviar em pequenas quantidades de bytes(100, 200, 500, até 700bytes) o arquivo chega Ok, sem problema algum…
Mas quando mando a aplicação mandar em tamanhos maiores(10kbytes, 50kbytes, etc…) da erro de CRC(a minha aplicacao tb implementa este CRC)… ai que surge a duvida… socket tem algum tratamento pra isso?a um determinado “x” de bytes enviados vc precisa filtrar alguma coisa?!?

Pq ja debuguei e não achei o erro… qnd mando enviar por poucos bytes da tudo 100%, mas qnd aumento o tamanho de bytes os erros SEMPRE ocorrem. Alguem tem alguma ideia do que seja?

3 Respostas

E

Por acaso você também manda a quantidade de bytes a serem lidos, antes de cada pacote de bytes? É interessante você fazer isso, porque o método available() não é bom de ser usado (não serve para o que você quer). Como você deve já ter percebido, muitas vezes read() retorna mais ou menos bytes que você espera.

Para evitar problemas com envio de bytes, sempre encapsule suas mensagens usando um cabeçalho, algo parecido com:

2 primeiros bytes = um short, indicando o tamanho do seu bloco a ser enviado.
4 próximos bytes = CRC-32 dos dados a serem mandados.
N bytes = o bloco a ser mandado.
B

Opa, entanglement.

Obrigado pela atenção.

Mas eu ja faço isso sim, antes de enviar meus bytes, eu envio um inteiro indicando quantos bytes serão enviados, para no servidor ja conseguir buscar a quantidade certa de bytes.

no meu caso, o CRC é calculado baseado em todos os bytes do arquivo, entao so mando na primeira leva de bytes em um cabecalho, que ja contem o crc…o restante dos bytes enviados(segmentados no tamanho que o usuario indicou)é todos bytes do arquivo(dados).

O estranho eh justamente isso… qnd o usuario escolhe uma quantidade pequena de bytes(400 por exemplo), a aplicação manda, o servidor recebe e da tudo ok. Quando envio com uma quantdade maior(10kbytes por exemplo), a aplicacao manda, o servidor recebe… mas recebe com erros(ou seja, ah alguma interferencia nos bytes que acabam chegando incorretos) ocasionando erro de crc.

Agradeço atenção de todos.

E
  1. Não mande um bloco de 10K; mande blocos de 1.5K pode exemplo.
  2. Você tem certeza que os bytes estão realmente chegando errado, ou você é que está se equivocando no cálculo de CRC?
  3. Você está tomando cuidado com a soma das quantidades dos bytes efetivamente recebidos? Não se esqueça que read retorna a quantidade de bytes; pode ser que você simplesmente esteja usando todos os bytes do buffer, não somente os que foram lidos.
  4. Nunca nunca nunca use o método read() que retorna só 1 byte. É muito lento
Criado 1 de junho de 2010
Ultima resposta 1 de jun. de 2010
Respostas 3
Participantes 2