2013-07-27 30 views
0

如何將數據包拆分爲更小的部分,然後發送它? 目前我已經嘗試過非常手動地做,例如圖像。拆分以適應數據包c#UDP

我會有2個udp客戶端,有一個圖像,我們說800x600。 用800x300和其他800x300發送1 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); 

     } 
    } 

下面是代碼,什麼it's做的是簡單的。 截取桌面。 將它放在640x480位圖中(儘管如此,桌面大小要小得多)。

發送2包與圖片的兩半。

接收數據,合併它們,並將它們作爲背景。

現在,這適用於640x480,這是非常小的。

現在,如果我想用更高的東西來做,我必須做很多包。 所以我想知道是否有可能讓它多一點,自動。

爲什麼我分裂包和使用許多客戶端是因爲我不知道如何發送比緩衝區更大的東西(65kb),嘗試搜索它,但我不明白。

回答

0

就你而言,我認爲更好的方法是使用TCP而不是UDP。

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)。延遲在這裏非常重要。 安迪想知道,什麼時候udp數據包不會到達? 它只在全球互聯網上(這意味着它可以在路由器上跳轉等時消失)? 因爲如果是這樣,那麼它對我沒什麼影響,因爲我使用它的唯一情況,你可以將它與局域網進行比較。 爲什麼我使用很多客戶端是因爲我不知道如何發送大於允許的緩衝區(65kb)的東西。 – Zerowalker

+0

好吧,我把幾個網址放在有趣的例子上,幫助你理解它是如何工作的。至於丟失的數據包,如果在特定時間內有太多的數據包要處理,或者網絡出現故障等,它也可能發生在局域網上。 – maxim1500