2013-07-12 4 views
-2

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

В принципе, у меня есть базовый сервер, с которым можно подключиться, чтобы видеть статистику, подключаться к другим серверам GAME и т. Д. Вся эта клиент-серверная модель - это TCP. Однако проблема связана с моим игровым сервером. В этом случае TCP-соединение между всеми игроками и сервером устанавливается на определенном порту, и я отправляю пакеты на и с сервера на другом порту через UDP. Причиной этого является то, что я могу отделить важные сообщения от менее важных «государственных» обновлений. Локально это работает отлично, однако, когда я пытаюсь это «через Интернет», пакеты отправляются, но не принимаются.

TCP-соединение устанавливается через Интернет, но пакеты UDP не попадают в их местоположение. Я попытался добавить правила в брандмауэр Windows (исходящий и входящий), и я выполнил переадресацию портов во всех системах. Я знаю, что это не проблема с моим кодом.

Обе системы работают на 64-разрядной Windows 7. Я отправляю 64 байтовых пакета 40 раз в секунду, а не один, и это не проблема с пакетом.

И, наконец, мой вопрос: Какие еще вещи могут блокировать пакеты UDP? Что мне нужно учитывать? Я прошел мимо забвения, чтобы связать() этап и т. Д.

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

Спасибо!

ответ

3

Первое, что я делаю в ситуациях, подобных этому, я запускаю WireShark и наблюдаю за выходом моих пакетов - просто чтобы быть уверенным, что все в порядке.Если у вас есть возможность запускать захват пакетов на удаленном конце, это может сказать вам гораздо больше - например, блокирует ли принимающая ОС по какой-либо причине. Если вы видите пакеты, выходящие из источника, но не прибывающие в пункт назначения, они отбрасываются в пути. Это может произойти при любом количестве брандмауэров или маршрутизаторов.

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

Какова конфигурация сети на каждом конце этого сообщения? Какой порт UDP вы используете?

+0

для UDP я использую порт 667, а для TCP я использую порт 666. Я знаю его в диапазоне 0-1024, но я пробовал все порты. Я использую Windows 7 для всех систем, если это вообще помогает. –

+0

Для сетевых конфигураций я пересылаю все TCP 666 на сервер и UDP 667. TCP работает нормально, но UDP - это то, что отправляется, но не получено. Я также создал правила входящего и исходящего трафика в брандмауэре Windows, но это ничего не изменило. –

+0

Спасибо за этот ответ. Это потрясающе. Я не искал лекции о различиях между TCP и UDP, но больше о том, как я мог бы исправить проблему за пределами кода, который именно вы предоставили. –

2

Доставка UDP-пакетов не гарантируется. Существует сотни причин, по которым они теряются, начиная от перегрузки и заканчивая политическим блокированием до ...

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

Короче говоря, если вам нужна гарантированная доставка, то должен использовать TCP - это то, для чего оно предназначено.

+0

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

+1

Это не вопрос того, что «предотвращает», это вопрос о том, что нет ничего, что могло бы вызывать гарантированную доставку. Кода просто нет. – EJP

+0

@ EJP да очень верно. Если я знаю, что они отправляются (из моей машины и маршрутизатора), что может остановить ее на стороне сервера? Извините, я должен быть более ясным. –

1

Первое, что я попробую в вашем случае, - использовать netcat в режиме UDP (nc -u) между двумя машинами через ваше интернет-соединение и сделать эту работу. Таким образом, вы уверены, что это не проблема в вашем программном обеспечении.

Из вашего описания я бы предположил, что это проблема межсетевого экрана. Убедитесь, что пакеты UDP сначала проходят через брандмауэр. В вашем брандмауэре может быть несколько настроек, которые блокируют UDP-пакеты. Пакетное отслеживание пакетов только для Linux блокирует все входящие UDP-пакеты, даже если это явно указано в правиле.

+0

Попробуй это, спасибо! –

Смежные вопросы