Отправить UDP-пакеты на IP с NAT - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть сервер с открытым IP без NAT.Он получает пакеты UDP, и я хочу отправить их каждому подключенному клиенту.

Клиент или клиенты будут за NAT.

Я читал об UDP дыроколе, но это не совсем то, что я хочу.Я не пытаюсь отправить от клиента к клиенту.Я хочу, чтобы поток данных шел от клиента -> сервера -> всех клиентов.

Клиент

// Init TCP Socket
connection = new Socket(connectionAddress, 54540);

// Create receive socket
DatagramSocket socketReceive = new DatagramSocket(54541);

Сервер


// Receive socket
receiveAudioSocket = new DatagramSocket(54541);

// Thread to handle new received packets
ServerAudioReceiverWorker audioReceiverWorker = new ServerAudioReceiverWorker(receiveAudioSocket, this);
audioReceiverWorker.start();

// TCP Socket
serverSocket = new ServerSocket(54540);
System.out.println("Server has started");

Это базовая настройка для моего клиентского сервера.

Я ожидал, что если я отправлюUDP-пакет от клиента к общедоступному IP-адресу сервера.Маршрутизатор добавил бы правило NAT для порта 54541 в сети клиентов для получения пакетов UDP, отправленных с сервера обратно на общедоступный IP-адрес клиента и порт 54541. Не похоже, что он работает таким образом.

Я полагаю, это связано с тем, что назначаемому правилу NAT назначается определенный порт для запросов к общедоступному IP-адресу для назначения локального IP-адреса.Я не уверен, как найти порт, на который сервер должен отправлять пакеты для каждого клиента.

Нужно ли использовать UPnP, чтобы открыть порт в сети клиента и сообщить серверу, какой портотправлять пакеты на.

1 Ответ

1 голос
/ 19 сентября 2019

NAT требует, чтобы клиент за маршрутизатором NAT сначала инициировал соединение с внешним сервером, чтобы маршрутизатор NAT мог создать состояние для преобразования адреса и порта.Ответ от сервера должен точно соответствовать состоянию, так как в противном случае NAT-маршрутизатор не сможет выполнить обратный перевод.

Это означает:

  • Вы должны использовать один и тот же сокет для отправки иполучение в клиенте, т. е. вы не можете ожидать ответа на другом порту, как в настоящее время.
  • Сервер должен отправлять сообщения точно на тот же IP-адрес и порт, которые использовались в качестве источника клиентами дляобратитесь к серверу, и он должен быть отправлен с того же IP-адреса и порта, которые клиенты использовали в качестве пункта назначения - обычно это делается с использованием одного и того же сокета на сервере.
  • Невозможно отправлять сообщения клиентамкоторые недавно не обращались к серверу, потому что в этом случае нет соответствующего состояния в клиентском маршрутизаторе NAT (срок его действия истекает через некоторое время).
...