2012-03-25 131 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,所以很少确保交付,除非你有一些机制来确保交付。确保你有一个固定的缓冲区大小,并尝试发送图像块而不是一个整体。