C # Peer-to-Peer Networking - обойти маршрутизаторы - PullRequest
4 голосов
/ 26 апреля 2010

Я хочу закодировать одноранговую программу чата в C #. Я пытаюсь выяснить, как будет работать сеть. Я знаю, что концепция заключается в том, что каждый узел является клиентом и сервером одновременно. Он может подключиться и быть подключен к. Но у меня вопрос: как подключиться к компьютеру за маршрутизатором, если порт не будет перенаправлен на этот компьютер? Я знаю, что такие вещи, как Bittorrent, делают это без проблем. Я планировал использовать трекер для хранения списка пиров и портов, которые они прослушивают, но я все еще не понимаю, как справиться с проблемой роутера. Может кто-нибудь объяснить, пожалуйста?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

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

Наиболее эффективное и простое решение состоит в том, чтобы сторонняя сторона опосредовала соединение, вставляя себя в поток данных. Вместо того, чтобы каждый человек в чате был одновременно «клиентом» и «сервером», существует только один сервер, и он находится в общеизвестном общедоступном месте; тогда все подключаются к нему. Затем сервер управляет связью и отправляет сообщения людям во время чата.

Однако есть и другие решения. Например, вместо использования общеизвестного сервера вы можете использовать общеизвестные порт (ы) : все соединения осуществляются через этот порт (ы). Тогда вам не нужен сервер, но на всех конечных точках этот порт должен быть открыт, что требует предварительной настройки.

3 голосов
/ 26 апреля 2010

Я предполагаю, что вы имеете в виду в среде NAT, и если это так, прочитайте и поймите Одноранговая связь через трансляторы сетевых адресов (Ford, Srisuresh & Kegel .

Ключевая концепция заключается в том, что каждый клиент должен инициировать соединение, которое откроет путь через устройство NAT. Может быть полезно обратиться к исходному коду Pidgin , чтобы получить некоторые идеи.

3 голосов
/ 26 апреля 2010

В дополнение к ответу Джона Феминеллы, вы можете рассмотреть возможность использования службы UPNP , которую поддерживают многие потребительские сетевые устройства.

...