2013-07-27 2 views
0

어떻게 작은 부분으로 패킷을 분할 한 다음 보낼 수 있습니까? 현재 저는 이미지 (예 : 이미지)를 매우 수동으로 시도했습니다.패킷에 맞게 분할 C# UDP

나는 2 개의 udp 클라이언트가 있고, 800x600이라고하는 이미지가있다. 800x300의 udp 클라이언트와 800x300의 udp 클라이언트를 보냅니다.

그런 다음 병합하십시오.

하지만 더 좋은 방법이 있어야한다고 생각합니다. 어떤 종류의 기능입니까? 큰 패키지에서는 매우 어려워지기 때문에 10 개 이상의 udpclients를 만들어야합니다.

private void Initialize() 
    { 


     Bitmap holder = new Bitmap(640, 480); 

     pictureBox1.Size = new System.Drawing.Size(1920, 1200); 
     EndPoint ourEP = new IPEndPoint(IPAddress.Any, 0); 

     EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 1700)); 
     EndPoint remoteEP2 = (EndPoint)(new IPEndPoint(IPAddress.Any, 1701)); 


     udpcap = new UdpClient(); 
     udpcap1 = new UdpClient(); 
     udpcap.Client.Bind(remoteEP); 
     udpcap1.Client.Bind(remoteEP2); 

    } 


private void Listen() 
    { 
     while (checkBox1.Checked) 
     { 
      byte[] data = udpcap.Receive(ref adress); 
      byte[] data2 = udpcap1.Receive(ref adress); 
      Bitmap bitmap = new Bitmap(byteArrayToImage(data).Width + byteArrayToImage(data2).Width, Math.Max(byteArrayToImage(data).Height, byteArrayToImage(data2).Height)); 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       g.DrawImage(byteArrayToImage(data), 0, 0); 
       g.DrawImage(byteArrayToImage(data2), byteArrayToImage(data).Width, 0); 
      } 

      pictureBox1.BackgroundImage = bitmap; 

     } 
    } 
    private static Image cropImage(Image img, Rectangle cropArea) 
    { 
     Bitmap bmpImage = new Bitmap(img); 
     Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); 
     return (Image)(bmpCrop); 
    } 
    private void Send() 
    { 
     bool p = true; 
     while (capcon == true) 
     { 
      Rectangle h = new Rectangle(0, 0, 320, 480); 
      Bitmap holder = new Bitmap(640, 480); 
      Graphics graphics = Graphics.FromImage(holder); 
      graphics.CopyFromScreen(0, 0, 0, 0, new Size(1920, 1200), CopyPixelOperation.SourceCopy); 

      byte[] u = imageToByteArray(cropImage(holder, h)); 
      udpcap.Send(u, u.Length, adress.Address.ToString(), 1700); 
      h = new Rectangle(320, 0, 320, 480); 
      byte[] u1 = imageToByteArray(cropImage(holder, h)); 
      udpcap1.Send(u1, u1.Length, adress.Address.ToString(), 1701); 

     } 
    } 

여기 코드는 간단합니다. 바탕 화면의 스크린 샷을 만듭니다. 640x480 비트 맵으로 배치하십시오 (데스크톱 크기보다 훨씬 작음).

사진 2 개로 패키지 2 개를 보냅니다.

데이터를 수신하여 결합하고 배경으로 배치하십시오.

이제는 640x480에서 매우 작습니다.

이제 내가 더 높은 무언가로하고 싶다면 극히 많은 패키지를 만들어야합니다. 그래서 좀 더 자동적으로 가질 수 있는지 궁금합니다.

왜 나는 패키지를 분할하고 많은 클라이언트를 사용하는 이유는 버퍼 (65kb)보다 큰 것을 보내는 방법을 모르는 것이기 때문에 검색을 시도했지만 이해가 안됩니다.

답변

0

귀하의 경우에는 UDP 대신 TCP를 사용하는 것이 더 나은 방법이라고 생각합니다.

UDP는 다른 쪽이 모든 패킷을 수신하고 송신 된 것과 동일한 순서로 수신된다는 것을 보장하지 않습니다. 나는 그것이 당신이 동시에 두 개의 다른 클라이언트를 사용하는 이유라고 생각합니다. 이 방법을 사용하면 패킷을 직접 관리해야합니다 (분할, 재구성, 모든 수신 확인 등)

TCP는 큰 전송에 적합합니다. 그것은 상자 시퀀싱, 조각화, 흐름 제어 등을 제공 할 것입니다. 오버 헤드가 조금 더 있지만, 당신의 경우에는 아무런 차이가 없을 것입니다.

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=VS.71).aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx

+0

동시에 여러 클라이언트를 지원해야하는 경우, 이것 좀보세요 : http://social.msdn.microsoft.com/Forums/en-US/d9e4bcbc-3149- 4817-8d7c-37cdb29f8be0/tcp-server-with-multiple-clients – maxim1500

+0

TCP를 테스트하고 싶지만 어떻게 작동하는지 이해할 수 없으며 UDP가 훨씬 쉽습니다 (여기서는 프로그래밍으로 noob). 여기서 대기 시간은 매우 중요합니다. Andi가 알고 싶습니다. 언제 UDP 패킷이 도착하지 않을까요? 은 글로벌 인터넷에서만 가능합니다 (라우터 등에서 뛰어 다니는 동안 사라질 수 있음을 의미)? 만약 그렇다면, 그것은 나에게 중요하지 않다. 나는 그것을 독특한 상황에 사용하고 있기 때문에 LAN과 비교할 수있다. 많은 클라이언트를 사용하는 이유는 허용 된 버퍼 (65kb)보다 더 큰 내용을 보내는 방법을 알지 못하기 때문입니다. – Zerowalker

+0

글쎄, 어떻게 작동하는지 이해하는 데 도움이되는 흥미로운 예제에 몇 개의 URL을 넣었다.잃어버린 패킷에 대해서도 특정 순간에 처리 할 패킷이 너무 많거나 네트워크에 결함이있는 경우 LAN에서 발생할 수 있습니다. – maxim1500