2011-04-29 82 views
0

我寫了這個代碼發送發送者和接收者之間的圖像。爲什麼我運行這段代碼時會出現這條消息?

首先你必須運行receiver然後運行sender。

當我測試的1KB和1.5KB之間的圖像,此代碼,它工作正常,但是當我嘗試發送一個較大的圖像,出現此消息

無法計算表達式,因爲 原生... .......

我的代碼在下面,有人可以幫忙嗎?

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 

    using System.Net; 
    using System.Net.Sockets; 
    using System.IO; 
    using System.Drawing; 
    using System.Drawing.Imaging; 
    using System.Windows.Forms; 
    using System.Threading; 

    namespace UPDTester 
    { 
     public class UDPClass 
     { 

      public Image Merge(Queue<byte[]> myList) 
      { 
       int ImgHeight = BitConverter.ToInt32(myList.Dequeue(), 0); 
       int ImgWidth = BitConverter.ToInt32(myList.Dequeue(), 0); 

       Bitmap bmp = new Bitmap(ImgWidth, ImgHeight); 
       Graphics g = Graphics.FromImage(bmp); 

       int x, y = 0; 
       while (myList.Count > 0) 
       { 
        x = BitConverter.ToInt32(myList.Dequeue(), 0); 
        y = BitConverter.ToInt32(myList.Dequeue(), 0); 
        g.DrawImage(ByteToBitmapConverter(myList.Dequeue()), x, y); 
       } 
       return bmp; 
      } 

      /// <summary> 
      /// Image Segmentatoin. 
      /// img: the image that we like to divided. 
      /// </summary> 
      public Queue<byte[]> Segmentation(Bitmap img) 
      { 
       Queue<byte[]> ByteArray = new Queue<byte[]>(); 

       ByteArray.Enqueue(BitConverter.GetBytes(img.Width)); 
       ByteArray.Enqueue(BitConverter.GetBytes(img.Height));      

       Image temimg; 

       for (ushort x = 0; x < img.Width - 5; x += 5) 
       { 
        for (ushort y = 0; y < img.Height - 5; y += 5) 
        { 
         //temimg = null; 
         temimg = img.Clone(new Rectangle(x, y, 5, 5), PixelFormat.Format32bppArgb); 
         ByteArray.Enqueue(BitConverter.GetBytes(x)); 
         ByteArray.Enqueue(BitConverter.GetBytes(y));      
         ByteArray.Enqueue(ImageToByteConverter(temimg)); 
        } 
       } 
       return ByteArray; 
      } 

      //Sender 
      public void SenderUDP(Bitmap img) 
      { 
       byte[] data = new byte[1024];    
       IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); 

       Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

       string welcome = "Hello, are you there?"; 
       data = Encoding.ASCII.GetBytes(welcome); 

       server.SendTo(data, data.Length, SocketFlags.None, ipep); 

       IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
       EndPoint Remote = (EndPoint)sender; 

       data = new byte[1024]; 
       int recv = server.ReceiveFrom(data, ref Remote); 

       MessageBox.Show("Message received from"); 
       MessageBox.Show(Encoding.ASCII.GetString(data, 0, recv)); 

       Queue<byte[]> temlist = Segmentation(img); 
       data = new byte[1024]; 
       data =temlist.Dequeue(); 
       //Send Width of image. 
       server.SendTo(data, data.Length, SocketFlags.None, ipep); 

       data = new byte[1024]; 
       data = temlist.Dequeue(); 
       //Send Height of image. 
       server.SendTo(data, data.Length, SocketFlags.None, ipep); 

       data = BitConverter.GetBytes(temlist.Count); 
       //Send Count of all list. 
       server.SendTo(data, data.Length, SocketFlags.None, ipep); 
       MessageBox.Show(temlist.Count.ToString() + " Iam Sender"); 

       while (temlist.Count > 0) 
       { 
        server.SendTo(temlist.Dequeue(), Remote); 
        //MessageBox.Show(temlist.Count.ToString() + "S"); 
       } 
       //server.Close(); 
      } 

      //Receiver..(IP, PortNum) 
      public Image ReceiverUDP() 
      //public void ReceiverUDP(ref PictureBox pic) 
      { 
       int recv; 
       byte[] data = new byte[1024]; 
       IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); 

       Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

       newsock.Bind(ipep); 
       MessageBox.Show("Waiting for a client...."); 
       //Console.WriteLine("Waiting for a client...."); 

       IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
       EndPoint Remote = (EndPoint)(sender); 

       recv = newsock.ReceiveFrom(data, ref Remote); 

       MessageBox.Show("Message received from ", Remote.ToString()); 
       MessageBox.Show(Encoding.ASCII.GetString(data, 0, recv)); 
       //Console.WriteLine("Message received from {0}:", Remote.ToString()); 
       //Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 

       string welcome = "Welcome to my test server"; 
       data = Encoding.ASCII.GetBytes(welcome); 
       newsock.SendTo(data, data.Length, SocketFlags.None, Remote); 

       Queue<byte[]> TempList = new Queue<byte[]>(); 

       //Receive Width of image. 
       newsock.ReceiveFrom(data, ref Remote); 
       TempList.Enqueue(data); 

       //Receive Height of image. 
       newsock.ReceiveFrom(data, ref Remote); 
       TempList.Enqueue(data); 

       //reccive Count of the list. 
       newsock.ReceiveFrom(data, ref Remote); 
       int count = BitConverter.ToInt32(data, 0); 
       MessageBox.Show(count.ToString() + " Iam Receiver"); 

       data = new byte[1024]; 
       while (count > 0) 
       {     
        data = new byte[1024]; 

        newsock.ReceiveFrom(data, ref Remote); 
        TempList.Enqueue(data); 
        data = new byte[1024]; 

        newsock.ReceiveFrom(data, ref Remote); 
        TempList.Enqueue(data); 
        data = new byte[1024]; 

        newsock.ReceiveFrom(data, ref Remote); 
        TempList.Enqueue(data); 

        MessageBox.Show(count.ToString());  
        count -= 3; 
       } 


       return Merge(TempList); 
      } 

      private byte[] ImageToByteConverter(Image img) 
      { 
       MemoryStream ms = new MemoryStream(); 
       img.Save(ms, ImageFormat.Png); 
       return ms.ToArray(); 
      } 

      private Image ByteToBitmapConverter(byte[] buffer) 
      { 
       MemoryStream ms = new MemoryStream(buffer); 
       Image img = Image.FromStream(ms); 
       return img; 
      } 
     } 
    } 
+7

如果您提供了所詢問的全部消息,它肯定會有所幫助。 – JohnFx 2011-04-29 20:01:15

+3

請發佈您收到的整個錯誤消息。此外,請指出錯誤發生在哪一行。 – NotMe 2011-04-29 20:02:45

+0

這並不能解釋你的錯誤,但是你將會遇到的一個問題是,如果圖像的寬度/高度不是5像素的倍數,你會失去一些像素。 – 2011-04-29 20:15:53

回答

0

它最有可能鎖定的原因是因爲UDP不能保證傳送。數據包可以被丟棄。如果發生這種情況,您的接收回路將永遠等待一個永遠不會到來的數據包。

相關問題