Чтение-запись UDP подключенных сокетов? - PullRequest
2 голосов
/ 11 января 2010

Мы пытаемся заставить две программы общаться друг с другом в игровой манере.Они поддерживают TCP-соединение с центральным сервером для получения информации типа «контроль», которую этот центральный сервер обеспечивает для обоих клиентов.Затем два клиента обмениваются данными с сервером udp, используя sendto () и recvfrom (), которые просто отправляют информацию, которую он получает, другому подключенному клиенту.

Теперь проблема в том, что если у вас есть домашний маршрутизатор илив частной сети, сервер udp sendto () для другого клиента будет отфильтрован брандмауэром, если только у вас не открыт порт, что намного больше, чем мы хотим, чтобы наши клиенты делали.

Но я неЯ не хочу терять преимущества UDP - меня не волнует потеря пакетов и порядок.Я готов управлять всем этим сам.

Итак, могу ли я надежно создать подключенный сокет UDP для чтения и записи?Я вспоминаю, как пытался сделать это в прошлом, и у меня было столько проблем, что я отказался и пошел к решению sendto () - recvfrom (), прежде чем понял, что я просто выпал из внешней сети.

Есть предложения, как с этим бороться?Любые лучшие практики или вещи, на которые я должен обратить особое внимание для подключенных UDP-сокетов?Это действительно возможно?

(я все это кодирую на чистом C).

Ответы [ 2 ]

1 голос
/ 11 января 2010

Полагаю, для этого и была разработана UPnP . Причина, по которой TCP пробивается через NAT, заключается в том, что устройству уровня 3 довольно просто связать входящие пакеты с активным сеансом TCP, ранее установленным через исходящее соединение. IIRC, UPnP решает ту же проблему со слоем поверх UDP, но требует поддержки со стороны маршрутизатора, поэтому он может не работать со старыми или плохо настроенными сетевыми устройствами.

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

0 голосов
/ 11 января 2010

Minupnpd http://miniupnp.free.fr/ поставляется с библиотекой, которую вы можете использовать, которая будет выполнять как UPnP, так и NAT-PmP, что избавит вас от множества внутренних маршрутизаторов. Вы также можете сделать то же, что и XBox и PS-3, то есть использовать Teredo и / или IPv6, если они включены на коробке; иногда они работают, когда ни UPnP, ни NAT-PmP никуда вас не приведут.

И затем есть другой подход, который называется ICE, и использует комбинацию протоколов, называемых STUN и TURN. Библиотеки здесь: http://www.pjsip.org/pjnath/docs/html/

Если пограничный маршрутизатор сайта не будет работать с одним из этих семи решений (UPnP, NAT-PmP, Teredo, IPv6, ICE, STUN и TURN), он либо полностью сломан, либо намеренно заблокирован.

...