Pergunta

O meu problema é que quando eu estou de transmissão de um fluxo contínuo de dados através de uma rede LOCAL (LAN) de rede às vezes aleatório de bytes é perdido no processo.

Como ele é agora o código está configurado para transmitir sobre 1027 bytes ou então ~40 vezes por segundo através de uma rede local e, por vezes (muito raro) de um ou mais bytes de são perdidas.

A única coisa que me deixa perplexo é que o byte real não é "perdido" ele apenas é definido para 0, independentemente dos dados originais.(Eu estou usando TCP pelo caminho)

Aqui é o envio de código:

    public void Send(byte[] data)
    {
        if (!server)
        {
            if (CheckConnection(serv))
            {
                serv.Send(BitConverter.GetBytes(data.Length));
                serv.Receive(new byte[1]);
                serv.Send(data);
                serv.Receive(new byte[1]);
            }
        }
    }

e o recebimento de código:

    public byte[] Receive()
    {
        if (!server)
        {
            if (CheckConnection(serv))
            {
                byte[] TMP = new byte[4];
                serv.Receive(TMP);
                TMP = new byte[BitConverter.ToInt32(TMP, 0)];
                serv.Send(new byte[1]);
                serv.Receive(TMP);
                serv.Send(new byte[1]);
                return TMP;
            }
            else return null;
        }
        else return null;
    }

O envio e o recebimento de vazio bytes são apenas para manter o sistema em sincronia sorta.Pessoalmente, eu acho que o problema está no lado receptor do sistema.ainda não foram capazes de provar que o jet embora.

Foi útil?

Solução

Só porque você dá Receive(TMP) 4 matriz de bytes não significa que ele está indo para o preenchimento da matriz com 4 bytes.Ao Receber uma chamada está autorizado a colocar em qualquer lugar entre 1 e TMP.Length bytes para a matriz.Você deve verificar a devolvidos int para ver quantos bytes do array onde preenchido.

Conexões de rede de fluxo com base não baseadas em mensagens.Qualquer bytes colocar no fio apenas obter concatenados em uma grande fila e conseguir ler em por outro lado, como ele se torna disponível.Então, se você enviou duas matrizes 1,1,1,1 e 2,2,2,2 é perfeitamente possível que, no lado da recepção você chamar Receive por três vezes, com um 4 matriz de bytes e obter

  • 1,1,0,0 (Receber devolvido 2)
  • 1,1,2,2 (Receber devolvido 4)
  • 2,2,0,0 (Receber devolvido 2)

Então, o que você precisa fazer é olhar para os valores que você tem de volta a partir de Receive e manter um loop até que a sua matriz de bytes é completo.

byte[] TMP = new byte[4];

//loop till all 4 bytes are read
int offset = 0;
while(offset < TMP.Length)
{
    offset += serv.Receive(TMP, offset, TMP.Length - offset, SocketFlags.None);
}
TMP = new byte[BitConverter.ToInt32(TMP, 0)];

//I don't understand why you are doing this, it is not necessary.
serv.Send(new byte[1]); 

//Reset the offset then loop till TMP.Length bytes are read.
offset = 0;
while(offset < TMP.Length)
{
    offset += serv.Receive(TMP, offset, TMP.Length - offset, SocketFlags.None);
}

//I don't understand why you are doing this, it is not necessary.
serv.Send(new byte[1]);

return TMP;

Por fim, você disse que "o fluxo de rede confunde você", eu estou disposto a apostar que o problema acima é uma das coisas que mais confuso você, indo para um nível inferior não irá remover essas complexidades.Se você quiser que essas peças complexas ido, então você não terá de lidar com eles, você vai precisar usar uma festa de 3 a biblioteca que irá lidar com isso para você dentro da biblioteca.

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