2010-04-25 1 views
4

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

ответ

3

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

4

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

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

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

+0

сервер == прослушивание соединений на порту. –

+0

@Greg: Я, вероятно, мог бы сформулировать это лучше. Я имел в виду «... вместо того, чтобы использовать как хорошо известную конечную точку, так и известный порт, вы можете просто иметь хорошо известный порт, если все заранее настраивают вещи, и все одноранговые узлы известны друг другу «. Не очень полезно для чат-программы, но это возможно. –

3

Я предполагаю, что вы имеете в виду в среде NAT, и если да, прочитайте и поймите Peer-to-Peer Communication Across Network Address Translators (Ford, Srisuresh & Kegel.

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

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

  • Нет связанных вопросов^_^