Pregunta

Mi problema es que cuando estoy transmitiendo un flujo continuo de datos a través de una red LAN LOCAL, a veces se pierden bytes aleatorios en el proceso.

Tal como está ahora, el código está configurado para transmitir aproximadamente 1027 bytes aproximadamente ~40 veces por segundo a través de una LAN y, a veces (muy raro), uno o más bytes se pierden.

Lo que me desconcierta es que el byte real no se "pierde", simplemente se establece en 0 independientemente de los datos originales.(Por cierto, estoy usando TCP)

Aquí está el código de envío:

    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]);
            }
        }
    }

y el código de recepción:

    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;
    }

El envío y la recepción de bytes vacíos son solo para mantener el sistema sincronizado.Personalmente creo que el problema radica en el lado receptor del sistema.Sin embargo, no he podido probar ese avión.

¿Fue útil?

Solución

Sólo porque das Receive(TMP) una matriz de 4 bytes no significa que se vaya a llenar con 4 bytes.La llamada de recepción puede realizarse en cualquier lugar entre 1 y TMP.Length bytes en la matriz.Debes comprobar la devolución. int para ver cuántos bytes de la matriz se llenaron.

Las conexiones de red se basan en transmisiones, no en mensajes.Cualquier byte que coloque en el cable simplemente se concatena en una gran cola y se lee en el otro lado a medida que esté disponible.Entonces, si enviaste las dos matrices 1,1,1,1 y 2,2,2,2 es muy posible que en el lado receptor llames Receive tres veces con una matriz de 4 bytes y obtener

  • 1,1,0,0 (Recibir devuelto 2)
  • 1,1,2,2 (Recibir devuelto 4)
  • 2,2,0,0 (Recibir devuelto 2)

Entonces, lo que debes hacer es mirar los valores que obtuviste de Receive y siga repitiendo hasta que su matriz de bytes esté llena.

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 último, dijiste "la transmisión de la red te confunde". Estoy dispuesto a apostar que el problema anterior es una de las cosas que te confundieron; ir a un nivel inferior no eliminará esas complejidades.Si desea eliminar estas partes complejas para no tener que manejarlas, necesitará usar una biblioteca de terceros que las manejará por usted dentro de la biblioteca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top