Передача UDP по глобальной сети - PullRequest
0 голосов
/ 13 августа 2011

За последние пару дней я задал пару похожих вопросов и получил действительно большую помощь.Теперь я немного лучше понимаю свою проблему, но, похоже, наткнулся на препятствие.Я написал клиент-серверное приложение, которое использует как TCP, так и UDP соединение.Соединение TCP отлично работает как в локальной сети, так и в глобальной сети, но соединение UDP не работает по глобальной сети.Основываясь на вопросах, которые я задавал ранее, я понял, что мой сервер должен ответить клиенту в конечной точке, с которой он получил сообщение.Я настроил все на работу таким образом.Я отправлю код после вопроса.Моя проблема заключается в том, что, хотя я использую EndPoint из клиентского соединения, а клиент сначала устанавливает соединение, я все еще не могу установить соединение UDP.Похоже, что он работал в одной сети, но затем не справился со всеми другими, которые я пробовал.Любая помощь в выяснении этого приветствуется.Вот код:

Получение UDP-сообщений на сервере

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        trans.Bind(serverIP);
        System.Net.IPEndPoint ipep = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
        System.Net.EndPoint Remote = (System.Net.EndPoint)ipep;

        while (true)
        {

            byte[] content = new byte[1024];

            int recv = trans.ReceiveFrom(content,ref Remote);

            int portNum = ((System.Net.IPEndPoint)Remote).Port;
            string message = Encoding.ASCII.GetString(content);
            string[] data = message.Split((char)124);
            //UpdateStatus(data[0] + data[1]);

            UserConnection sender = (UserConnection)clients[data[0]];
            if (sender.PortNumber != portNum)
                sender.PortNumber = portNum;
            if (sender.RemoteEnd != Remote)
            {
                sender.RemoteEnd = Remote;//Stores the EndPoint from the client connection
            }
            if (data.Length > 2)
            {
                OnLineRecieved(sender, data[1] + "|" + data[2]);
            }
            else
            {
                OnLineRecieved(sender, data[1]);
            }
        }
    }

Клиент слушает здесь

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)servIP;
        while (true)
        {
            byte[] content = new byte[1024];
            int  data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);
            result = message;

            ProcessCommands(message);

        }
    }

РЕДАКТИРОВАТЬ: функция отправки СЕРВЕРА

public void SendData(string data)
    {
        if (RemoteEnd != null)//RemoteEnd is refreshed every time the client sends a UDP message
//Each Clients RemoteEnd is stored in a collection of Client objects in a server hashtable
        {
            //ipep = new IPEndPoint(ipAdd, PortNumber);
            byte[] dataArr = Encoding.ASCII.GetBytes(data);

            trans.SendTo(dataArr, dataArr.Length, SocketFlags.None, RemoteEnd);
        }
    }

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Вы должны определить, является ли это проблемой программирования или проблемой конфигурации сети.

я бы запустил клиентское приложение на сервере и серверное приложение на клиентском компьютере (и переключил хосты, к которым они подключаются).

Если серверное приложение больше не получает UDP-сообщения от клиентского приложения, значит, у вас проблема с сетевой конфигурацией.

Если серверное приложение все еще может получать сообщения от клиентского приложения, значит, у вас проблема с программированием.

1 голос
/ 13 августа 2011

Там может быть много вещей не так. Помните, что UDP не обеспечивает передачу, повторные передачи или подтверждения. Так что если они вам нужны, вы должны предоставить их. Если клиент сначала отправил, а затем ждал ответов на каждый запрос, ваш первый потерянный пакет прервет соединение.

Вы также забыли описать проблему. Вы говорите, что не можете установить соединение, но что это значит? Получает ли сервер первый пакет клиента или нет? Получает ли клиент первый ответ от сервера или нет?

...