Не удается отправить дграм на внешний IP - PullRequest
1 голос
/ 26 марта 2012

мне нужна помощь :)

Я провел множество поисков в Google и не нашел ответа, надеюсь, кто-то может помочь мне здесь :)

Итак, я пишу простой клиент P2P Video Chat, который создает 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 ]

2 голосов
/ 26 марта 2012

Это исключение выдается из IPAddress.Parse, поскольку ConnectionSettings.ipAdress не является действительным адресом IPv4 или IPv6.

То, что вы используете, не является действительным IP-адресом. Возможно, у вас есть встроенное пространство или что-то в этом роде.

0 голосов
/ 26 марта 2012

В вашем коде отправки данных попробуйте отправить данные несколько раз.Нет необходимости, чтобы в самом первом случае вы получали данные на стороне получателей.Это UDP, а не TCP, поэтому доставка обеспечивается редко, если у вас нет механизма для обеспечения доставки.Убедитесь, что у вас фиксированный размер буфера, и попробуйте отправить изображение кусками вместо целого.

...