UDP Сервер для связи с клиентом - UDP не имеет состояния, как обойти маршрутизатор? - PullRequest
1 голос
/ 02 февраля 2011

В недавней серии вопросов я много спрашивал о UDP, boost :: asio и c ++ в целом.

Мой последний вопрос, на который, похоже, нет ответа здесь, в Stackoverflow, таков:

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

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

Мне не совсем понятно, как это будет работать с UDP, так как UDP не имеет состояния и не существует такой вещи, как "ответные пакеты" (насколько мне известно). Как я должен учитывать это в моем клиентском приложении?

Спасибо за любые ответы!

1 Ответ

7 голосов
/ 03 февраля 2011

UDP сам по себе не имеет состояния, но, как правило, это не брандмауэр. Соглашение по UDP заключается в том, что если запрос переходит от client:port_A до server:port_B, то ответ возвращается с server:port_B до client:port_A.

Брандмауэр может воспользоваться этим. Если он видит, что UDP-запрос отправляется от клиента, он добавляет в свою таблицу состояний запись, позволяющую ему распознать ответ (ы), чтобы разрешить их вход. Поскольку UDP не имеет состояния и не указывает на завершение соединения, брандмауэр обычно реализуют тайм-аут - если в течение определенного промежутка времени между этой парой адресов UDP не происходит трафик, связь в таблице состояний брандмауэра удаляется.

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

...