@Senture

Не получается сделать отправку сообщения с одного пк на другой подключенных к интернету по UDP?

Есть 2 приложения сервер и клиент:
Сервер
class Program
    {
        static void Main(string[] args)
        {
            UDPSocket s = new UDPSocket();
            s.Server(Console.ReadLine(), Convert.ToInt32(Console.ReadLine()));
            Console.WriteLine("Сервер запущен, ожидайте...");

            Console.ReadKey();
        }
    }

 class UDPSocket
    {
        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        private const int bufSize = 8 * 1024;
        private State state = new State();
        private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
        private AsyncCallback recv = null;
        private List<Clients> clients = new List<Clients>();

        public void AddUser(Clients client)
        {
            clients.Add(client);
        }

        public class State
        {
            public byte[] buffer = new byte[bufSize];
        }

        public void Server(string address, int port)
        {
            socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
            socket.Bind(new IPEndPoint(IPAddress.Parse(address), port));
            Recive();
        }

        private void Recive()
        {
                socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
                {
                    State so = (State)ar.AsyncState;
                    int bytes = socket.EndReceiveFrom(ar, ref epFrom);
                    socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
                    Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
                    BroadcastMessage(epFrom, Encoding.ASCII.GetString(so.buffer, 0, bytes));
                }, state);
        }

        public void BroadcastMessage(EndPoint end, string msg)
        {
            byte[] data = Encoding.ASCII.GetBytes(msg);
            for(int i = 0; i < clients.Count; i++)
            {
                if (clients[i].epFrom != end)
                    socket.BeginSendTo(state.buffer, 0, bufSize, SocketFlags.None, clients[i].epFrom, (ar) =>
                    {
                        State so = (State)ar.AsyncState;
                        int bytes = socket.EndSend(ar);
                    }, state);
            }
        }
    }

    class Clients
    {
        public EndPoint epFrom = null;
        UDPSocket udpSocket = null;

        public Clients(EndPoint end, UDPSocket udp)
        {
            epFrom = end;
            udpSocket = udp;
            udpSocket.AddUser(this);
        }
    }
Клиент
class Program
    {
        static void Main(string[] args)
        {
            UDPSocket c = new UDPSocket();
            c.Client(Console.ReadLine(), Convert.ToInt32(Console.ReadLine()));
            c.Send("TEST!");

            Console.ReadKey();
        }
    }
    class UDPSocket
    {
        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        private const int bufSize = 8 * 1024;
        private State state = new State();
        private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
        private AsyncCallback recv = null;

        public class State
        {
            public byte[] buffer = new byte[bufSize];
        }


        public void Client(string address, int port)
        {
            socket.Connect(IPAddress.Parse(address), port);
            Recive();
        }

        public void Send(string text)
        {
            byte[] data = Encoding.ASCII.GetBytes(text);
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
            {
                State so = (State)ar.AsyncState;
                int bytes = socket.EndSend(ar);
                Console.WriteLine("SEND: {0}, {1}", bytes, text);
            }, state);
        }

        private void Recive()
        {
                socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
                {
                    State so = (State)ar.AsyncState;
                    int bytes = socket.EndReceiveFrom(ar, ref epFrom);
                    socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
                    Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
                }, state);
        }
    }


На локальной машине все работает, а при попытке отправить сообщение с клиента на сервер (пк из разных городов и на пк который осуществляет работу сервер приложения порт(на скринах) открыт) сообщение не доходит до сервера.
Сервер запускаем так: ip 127.0.0.1, а порт 48855 или 10308(оба открыты).
Клиент запускаем так: смотрим ip пк на котором установлен сервер через сайт 2ip, и порт указываем 48855 или 10308, но сообщение не отправляется. Пробовали запустить еще так, но выбивает исключения:
5bd209691484f037350794.png
А на 2-ом скрине ip взят с сайта 2ip
5bd2099450284486323895.png

Подскажите что не так я делаю?

P.S. Спасибо!
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
@Senture Автор вопроса
Ответ найден:
В качестве ip в приложении сервера необходимо указывать 0.0.0.0 для прослушивания всех интерфейсов. Собственно и все.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Да дофига всего. Файрвол в винде режет любые такие внешние запросы, комп может быть включен через роутер, и для проброса с роутера на ПК надо его конфигурировать, наконец, у самого провайдера может быть NAT, и IP что вы видите на 2ip.ru принадлежит половине района... Вот поднимите VPN, заведите оба компа в него и внутри этой виртуальной сети может и достучитесь друг до друга
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы