Как реализовать peer-to-peer технологию?

Пишу программу, которая передаёт файлы между компьютерами(локальными) по технологии peer-to-peer.

Столкнулся со следующими сложностями:
1) По программированию сокетов много разжёванной информации для Linux, а хотелось бы под Windows. MSDN курил, но хотелось бы детальнее.
2) Каким образом искать компьютеры с запущенной программой? Желательно искать на всех интерфейсах. То бишь как найти список локальных компьютеров? Или их список можно и не знать, а просто отправить какой-то широковещательный запрос по определённому адресу и ждать ответ? (Сейчас довольствуюсь парсингом вывода стандартной утилиты "arp" с ключём "-a", но не понимаю, какой запрос на эти IP отправить и как на тех компьютерах его ждать)

З.Ы.: Такое задание давалось на хакатоне. У нашей команды расширились зрачки за пределы города:D За сутки некоторого результата добились, но "неджедайским" путём. Скомпилировали найденные в гугле куски кода. Да и вышло не p2p, а клиент-серверное приложение. Задание мне понравилось, решил таки разобраться в теме чуть более, чем полностью.
  • Вопрос задан
  • 7701 просмотр
Пригласить эксперта
Ответы на вопрос 3
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Программировать на чистых сокетах дело достаточно трудоемкое. Кроме того, что вам приходится работать на достаточно низком уровне, для обеспечения их неблокирующей работы(например при ожидании данных от другого клиента) надо использовать или потоки или poll/select.
Хорошим выходом может стать использования обертки, например из Qt. Так вы получите кросплатформенный код с меньшими затратами. Стоит также взглянуть на более высокоуровневые варианты, например ZeroMQ (не знаю как у них с p2p, но для общения между 2 клиентами это может упростить жизнь).
В простейшем случае для уведомления о своем присутствии клиент рассылает broadcast udp пакеты с информацией о себе. Основная проблема такого подхода, что такие пакеты будут зарезаны ближайшим маршрутизатором (наивно полагать что нам дадут разослать пакет каждому пользователю интернета). Поэтому такой подход работает только в простой локальной сети. Bittorent умеет хранить информацию децентрализовано, но для первоначального подключения необходимо знать адрес хотя бы одного подключенного участника.
После того как вы знаете адрес другого клиента вы можете установить с ним непосредственное соединение. На самом деле тут тоже не все так просто. Если он находится за NAT, а до распространения ip-v6 для большинства(?) клиентов так оно и есть, то придется что-то придумывать. По этой теме можно поискать по запросу "p2p over NAT".
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
Самый тупой вариант: пиры регистрируются на сервисе, который служит исключительно для service discovery.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
если речь именно о локальной p2p то тут либо броадкаст запрос либо искать машины вручную, для этого нужно узнать подсети на всех имеющихся интерфейсах и перебирать все "hello" запросами на определенный порт своей программы, перебор в любой нормальной сети займет не больше 5 секунд.
все остальное зависит от языка, там хоть mesh сеть строить можно.
p.s. идея интересная, но практического смысла в ней особо не видно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы