Слушатель сокета UDP не получает данные

1

Мой локальный ip: 192.168.0.70, внешний ip: 192.168.0.50: 60000

Я хочу получать данные от внешней ip-отправки на локальный ip. Я использую класс Socket, потому что я могу отправлять данные с помощью удаленного IPEndPoint. Но когда соединение Udp закрывается, локальный ip-порт динамически изменяется. Как я могу получать данные?

private static void UdpConnect()
    {
        try
        {
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.0.50"), 60000);

            Socket client = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);
            client.Connect(remoteEP);

            byte[] sendbuffer = { 1, 2, 3 };

            client.Send(sendbuffer);

            byte[] receivebuffer = new byte[512];

            client.Receive(receivebuffer);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
  • 1
    Не существует такой вещи, как соединение UDP, поэтому оно не может закрыться.
  • 0
    Скорее всего, вам потребуется статически назначенный IP-адрес вашего маршрутизатора и настройка переадресации портов. Это предполагает, что у вас есть статический внешний IP.
Показать ещё 9 комментариев
Теги:
sockets
udp
udpclient

1 ответ

1

Если вам нужно прослушивать определенный локальный порт, используйте Socket.Bind, а затем Socket.ReceiveFrom. Вы не нуждаетесь в вызове Socket.Connect, поскольку UDP - это протокол без установления соединения.

  • 0
    Я не могу использовать Socket.Bind, потому что его параметр должен быть 'Local EndPoint', и я не знаю номер локального порта. Я пытался 'EndPoint remoteEndPoint = remoteEP; client.ReceiveFrom (buffera, ref remoteEndPoint); '. не работал
  • 0
    Получающий номер является тем, кто назначает номер порта, поэтому вы должны принять решение об этом, а передающая сторона должна использовать тот же номер. Точно так же, как ваш браузер (отправитель) обычно отправляет HTTP-запросы на сервер через предопределенный порт (по умолчанию 80). Поэтому при вызове Bind вы сообщаете системе «Сообщения, поступающие на порт N, для меня», а затем, когда вы вызываете ReceiveFrom, вы получаете сообщение. Второй параметр (remoteEndPoint) - это ваш способ узнать, откуда поступают сообщения, так как при использовании UDP вы не знаете об этом заранее (это потому, что он без связи).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню