Потеря пакетов TCP - PullRequest
       2

Потеря пакетов TCP

0 голосов
/ 28 августа 2018

Я передаю видеопоток из одного приложения c # в другое. Когда я устанавливаю высокую частоту кадров, через некоторое время я не получаю правильные данные.

//Receiver
Socket s;
IPAddress ipAd = IPAddress.Parse("127.0.0.1");
var ip = IPAddress.Any;
myList = new TcpListener(ipAd, 8001);
myList.Start();
s = myList.AcceptSocket();

while (runThread)
{
        int buffertype = -1; MemoryStream img = null; int size = 0; int 
        pos = 0;
        try
        {
            // length of frame
            byte[] lengthb = new byte[32];
            int k = s.Receive(lengthb, SocketFlags.None);
            size = BitConverter.ToInt32(lengthb, 0);
            pos = 0;

            byte[] lengthframe = new byte[size];
            // chunking of data
            int chunksize = 100;
            while (pos < size - chunksize)
            {
                int rec = s.Receive(lengthframe, pos, chunksize, SocketFlags.None);
                pos += rec;
            }
            s.Receive(lengthframe, pos, size - pos, SocketFlags.None);

            img = new MemoryStream(lengthframe);
        }
 }

 // Other app: Sender (all is send)
 MemoryStream ms = new MemoryStream();
 img.CopyTo(ms);                
 byte[] ba = ms.ToArray();
 var buffer = BitConverter.GetBytes(ba.Length);
 stm.Write(buffer, 0, buffer.Length);
 stm.Write(ba, 0, ba.Length);

Как я могу быть уверен, что все посылки получены?

1 Ответ

0 голосов
/ 28 августа 2018

Отправитель:

stm.Write(buffer, 0, buffer.Length);

приемник:

byte[] lengthb = new byte[32];
int k = s.Receive(lengthb, SocketFlags.None);

Вы уверены, что тип buffer.Length имеет длину 32 байта (256 бит)? Я предполагаю, что это скорее 4 или 8 байт. Таким образом, вы потенциально получаете 32-байтовый буфер, который включает в себя ваше поле length в начале, а остальная часть является частью вашего кодированного видеопотока. Тогда вы выбрасываете эту часть. Звучит не очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...