Я делаю приложение веб-камеры, которое отправляет и получает небольшие изображения. Я сделал это, чтобы отправлять и получать, я тестировал на 127.0.0.1, и он работал нормально, но теперь я использую свой внешний внешний IP-адрес, и, кажется, он отправляет одно изображение, получает его, а затем беспорядок, я получаю какое-то массивное целочисленное значение в размере изображения, минус-значение, которое приводит к его сбою, я думаю, что, возможно, получение и отправка выполняются самостоятельно и как-то не работают. Я поставил 1000 мс задержка перед отправкой каждого изображения, и это было медленным, но работающим, как только я откладываю задержку, это испортится.Ошибка отправки пакета TCP
Вот код:
// This sends.
private void NewFrameReceived(object sender, NewFrameEventArgs e)
{
Bitmap img = (Bitmap)e.Frame.Clone();
byte[] imgBytes = EncodeToJpeg(img, 25).ToArray();
if (_tcpOut.Connected)
{
NetworkStream ns = _tcpOut.GetStream();
if (ns.CanWrite)
{
System.Threading.Thread.Sleep(500);
ns.Write(BitConverter.GetBytes(imgBytes.Length), 0, 4);
ns.Write(imgBytes, 0, imgBytes.Length);
}
}
}
// This receives.
private void listeningThread_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
// start listening for connections
_tcpIn = new TcpListener(IPAddress.Any, 54321);
_tcpIn.Start();
TcpClient _inClient = _tcpIn.AcceptTcpClient();
while (true)
{
NetworkStream ns = _inClient.GetStream();
if (ns.CanRead && ns.DataAvailable)
{
Byte[] imgSizeBytes = new Byte[4];
ns.Read(imgSizeBytes, 0, 4);
int imgSize = BitConverter.ToInt32(imgSizeBytes, 0);
Byte[] imgBytes = new Byte[imgSize]; <-- ERROR, GET CRAZY LARGE VALUE
ns.Read(imgBytes, 0, imgSize);
MemoryStream ms = new MemoryStream(imgBytes);
Image img = Image.FromStream(ms);
picVideo.Image = img;
}
}
}
Можете ли вы разместить исключение, которое вы получаете? –
Привет, иногда я получаю «Арифметическая операция, вызванная переполнением». и иногда переполнение памяти. (также строка ошибки была строка ниже - исправлена) – sprocket12
Слишком много переменных и неизвестных, чтобы иметь возможность правильно ответить на ваш вопрос. В качестве первого шага я бы предложил проверить, сколько байтов действительно получено от вашей первой передачи, и доказать, что оно соответствует тому, что отправляется. В зависимости от того, насколько велико ваше изображение, вы можете столкнуться с фрагментацией переданных данных. –