无法将dgram发送到外部IP

时间:2012-03-25 20:35:14

标签: c# udp client 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 个答案:

答案 0 :(得分:2)

IPAddress.Parse引发了异常,因为ConnectionSettings.ipAdress不是有效的IPv4或IPv6地址。

您使用的是有效的IP地址。也许你有一个嵌入空间或类似的东西。

答案 1 :(得分:0)

在您的数据发送代码中,尝试多次发送数据。在第一个实例中,您不必在接收器端接收数据。它的UDP而不是TCP,所以很少确保交付,除非你有一些机制来确保交付。确保你有一个固定的缓冲区大小,并尝试以块的形式而不是整体发送图像。