Я хочу закодировать одноранговую программу чата на С#. Я пытаюсь выяснить, как будет работать сеть. Я знаю, что концепция заключается в том, что каждый пир является клиентом и сервером одновременно. Он может подключаться и быть подключенным. Но мой вопрос: как подключиться к компьютеру за маршрутизатором без переадресации порта на этот компьютер? Я знаю, что такие вещи, как Bittorrent, делают это без проблем. Я планировал использовать трекер для ведения списка пиров и портов, которые они прослушивают, но я до сих пор не понимаю, как решить проблему с маршрутизатором. Может кто-нибудь объяснить?
С# одноранговая сеть - обход маршрутизаторов
Ответы (3)
В дополнение к ответу Джона Феминеллы вы можете рассмотреть возможность использования службы UPNP, которую поддерживают многие потребительские сетевые устройства. .
Вы правы, это не тривиально. Проблема заключается в том, что называется NAT или преобразование сетевых адресов. По сути, IP-адрес, который у вас есть в вашей собственной локальной сети, уникален, но в более широком контексте общедоступного Интернета многие люди за одним и тем же маршрутизатором будут иметь один и тот же общедоступный IP-адрес. Таким образом, имея IP-адрес и некоторые данные, вы не всегда можете сказать, какой человек на другом конце должен их получить.
Наиболее эффективным и простым решением является использование третьей стороны для посредничества в соединении, которая встраивается в поток данных. Вместо того, чтобы каждый человек в чате был «клиентом» и «сервером» одновременно, есть только один сервер, и он находится в общеизвестном публичном месте; тогда все подключаются к нему. Затем сервер управляет коммуникациями и отправляет сообщения людям, когда они общаются.
Однако есть и другие решения. Например, вместо общеизвестного сервера вы можете использовать общеизвестный порт(ы): все коммуникации осуществляются на этом порту(ах). Тогда вам не нужен сервер, но на всех конечных точках должен быть открыт этот порт, что требует предварительной настройки.
Я предполагаю, что вы имеете в виду в среде NAT, и если это так, прочитайте и поймите Peer-to - Одноранговая связь через трансляторы сетевых адресов (Ford, Srisuresh & Kegel.
Ключевая концепция заключается в том, что каждый клиент должен инициировать соединение, которое откроет путь через устройство NAT. Может быть полезно обратиться к исходному коду Pidgin, чтобы получить некоторые идеи.