2012-03-25 130 views
1

我需要幫助:)無法發送DGRAM外部IP

我已經做噸Ø谷歌搜索,並沒有發現答案,希望有人能幫助我在這裏:)

所以,我書面方式簡單的P2P視頻聊天客戶端,它從文本框創建IP並連接到端口5096上的「其他」。所以,當我嘗試連接到外部IP時,問題就開始了。聽衆不會收到包裹,我無法傳送我的圖像。有人可以幫幫我嗎?

這是我UdpPictureSender代碼:

class UDPPictureSender 
    { 
     bool closedSender = false; 
     Socket sending_socket; 
     IPAddress send_to_address; 
     IPEndPoint sending_end_point; 
     MemoryStream imageMemoryStream; 


     public UDPPictureSender() 
     { 
      initializeUdpPictureSender(); 

     } 

     public void initializeUdpPictureSender() 
     { 
      sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      send_to_address = IPAddress.Parse(ConnectionSettings.ipAdress); 
      sending_end_point = new IPEndPoint(send_to_address, 5096); 
     } 

     public void sendImage(Image image) 
     { 
      if (closedSender) 
      { 
       initializeUdpPictureSender(); 
      } 

      imageMemoryStream = new MemoryStream(); 
      image.Save(imageMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
      Byte[] bytes = imageMemoryStream.GetBuffer(); 
      sending_socket.SendTo(bytes, sending_end_point); 
      imageMemoryStream.Flush(); 
     } 

     public void closeConnection() 
     { 
      sending_socket.Close(); 
      send_to_address = null; 
      sending_end_point = null; 
      closedSender = true; 
     } 
    } 

這是UDPListener的代碼:

class UDPListener 
    { 
     private const int listenPort = 5096; 
     bool done = false; 
     bool stoped = false; 

     UdpClient listener; 
     IPEndPoint groupEP; 
     Image received_data; 
     byte [] receive_byte_array; 
     MemoryStream currentMemoryStream; 

     public UDPListener() 
     { 
      startupSettings(); 
     } 

     public void startupSettings() 
     { 
      groupEP = new IPEndPoint(IPAddress.Any, listenPort); 
      listener = new UdpClient(listenPort); 
     } 
     public Image listenForImages() 
     { 
      if (stoped) 
      { 
       startupSettings(); 
       stoped = false; 
      } 
      try 
      { 
       while (!done) 
       { 

        receive_byte_array = listener.Receive(ref groupEP); 
        currentMemoryStream = new MemoryStream(receive_byte_array); 
        received_data = Image.FromStream(currentMemoryStream); 
        return received_data; 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
      listener.Close(); 
      return null; 
     } 

     public void closeConnection() 
     { 
      listener.Close(); 
      stoped = true; 
     } 
    } 

誰能幫助我?提前

回答

2

由於這一例外正在從IPAddress.Parse拋出,因爲ConnectionSettings.ipAdress不是有效的IPv4或IPv6地址。

你正在使用的是不是有效的IP地址。也許你有一個嵌入式空間或類似的東西。

+0

我檢查過,使用trim(),而且什麼也沒有。 – hrza 2012-03-25 21:22:13

+0

@hrza什麼是難以理解的?您將無效地址(可能)傳遞給IPAddress.Parse。 '指定了無效的IP地址.'請檢查您的代碼並查看通過的內容。 – 2012-03-25 21:30:44

+0

你能給我一個我應該解析的字符串的例子嗎? – hrza 2012-03-25 21:38:02

0

在您的數據發送代碼中,嘗試發送數據幾次。在第一個例子中,您不需要在接收端收到數據。它的UDP而不是TCP,所以很少確保交付,除非你有一些機制來確保交付。確保你有一個固定的緩衝區大小,並嘗試發送圖像塊而不是一個整體。