작은 이미지를 보내고받는 웹캠 앱을 만들고 있습니다. 나는 그것을 보내고받을 수있게 만들었고, 127.0.0.1에서 테스트를 해 보았지만 정상적으로 작동했다. 그러나 이제는 내 자신의 외부 IP 주소를 사용하고 있는데, 하나의 이미지를 보내고 수신 한 다음 엉망진창처럼 보인다. 이미지 크기의 거대한 정수 값, 충돌로 이어지는 마이너스 값, 아마도 수신 및 전송이 자체적으로 실행되고 있으며 어떻게 든 동기화되지 않을 것이라고 생각합니다. 나는 각 이미지를 보내기 전에 1000ms의 지연 시간을 두었고 느린 것이지만 작동하면서 지연을 제거하자마자 망가져 버렸다.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
질문에 적절하게 응답 할 수있는 변수 및 알 수없는 변수가 너무 많습니다. 첫 번째 단계에서는 첫 번째 전송에서 실제로 몇 바이트가 수신되는지 확인하고 전송되는 바이트와 일치하는지 확인하는 것이 좋습니다. 이미지의 크기에 따라 전송되는 데이터 조각화가 발생할 수 있습니다. –