Автор Тема: P2P мессенджер  (Прочитано 2566 раз)

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
P2P мессенджер
« : 16.05.2022 15:21:30 »
Всем доброго времени суток. Сделал небольшой p2p мессенджер. Написан на С++, графический интерфейс базируется на GTK 4. Работает в двух режимах: интернет и локальная сеть. Связь между пользователями устанавливается посредством DHT и техники UDP hole punch. Возможна пересылка простых текстовых сообщений или файлов (тип и размер не ограничены). Возможна сборка для Windows (через MSYS2, тестирование сборки и работоспособности проводилось на Windows 10 и Windows 11).

Желающие могут скачать исходный код по ссылкам:

https://gitflic.ru/project/professornavigator/communist
https://github.com/ProfessorNavigator/communist

Сборка работает через meson и ninja.

Для дистрибутивов, базирующихся на p10 x86_64 собрал "неофициальные" rpm:

communist-1.4.1-alt2.x86_64.rpm
communist-1.4.1-alt2.src.rpm

Доступен также пакет для дистрибутивов на архитектуре i586, базирующихся на репозиториях p10  (тестирование сборки и работоспособности проводилось на Simply Linux 10.1 i586):
communist-1.4.1-alt2.i586.rpm

На других архитектурах работоспособность сборки и самой программы не тестировались.

Отзывы, пожелания и предложения можно оставлять здесь (если администрация ресурса не против). Или на github и gitflic. Там же в REAME.md и README_RU.md указана почта для связи, есть более подробное описание и дана краткая инструкция по эксплуатации.
« Последнее редактирование: 30.06.2022 13:39:21 от ProfessorNavigator »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 31 812
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: P2P мессенджер
« Ответ #1 : 16.05.2022 15:43:53 »
А какая у него лицензия ? ;-)

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 31 812
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: P2P мессенджер
« Ответ #2 : 16.05.2022 15:45:53 »
Всё, вижу :


License

GPLv3+ (see COPYING).

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #3 : 23.05.2022 15:31:01 »
Сделал версию 1.1

Добавлен функционал STUN сервера. Некоторые другие улучшения (см. окно настроек) и небольшая чистка кода.

Сборка и работоспособность программы протестированы на архитектуре i586 (для теста использовался Simply Linux p10).

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

Ссылки на исходный код и пакеты находятся в первом сообщении темы.

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 8 920
    • Email
Re: P2P мессенджер
« Ответ #4 : 23.05.2022 17:39:36 »
Хм, а автоматически юзеров нельзя искать, например, как ищутся сиды в торрент клиентах (даже в случае, когда в наличии нет рабочих ссылок торрент-трекеров из файла описания торрента)? Отправлять кому-то что-то для того, чтобы начать чатиться как-то сразу напрягает... Надо бы в автомате как-то сделать (имхо более полезная фича нежели всякая медиа и даже комнаты).

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #5 : 23.05.2022 20:40:59 »
Надо бы в автомате как-то сделать (имхо более полезная фича нежели всякая медиа и даже комнаты).
Я очень хотел сделать, но пока не придумал - как. Объясню, в чём проблема. В обычных мессенджерах, вроде того же Телграм, вы подключаетесь к серверу, установив с ним TCP соединение. Все ваши личные данные (или хотя бы частично) хранятся там - на сервере, который имеет прямой доступ в интернет, его адрес и порт общеизвестны. И если я хочу добавить вас в контакты, то всё происходит просто: я отправляю на сервер запрос вида "дай мне список пользователей". Сервер в ответ присылает. Я нахожу вас и отправляю на сервер запрос вида "хочу установить связь с...". Сервер сохраняет данный запрос, и при следующем вашем подключении перешлёт вам мою заявку, а мне ответ. Дальше - общаемся. Коммунист работает по-другому - у него нет единого централизованного внешнего сервера, соединение идёт напрямую между пользователями. При подключении к сети он отправляет запрос на STUN сервер, чтобы получить свой внешний ip адрес. Это нужно, потому что выход в интернет в большинстве случаев у рядовых пользователей не прямой: запрос идёт через домашний роутер, потом - через роутер провайдера (может быть и больше составляющих). И чтобы соединиться напрямую нам нужно знать ip:port конечного роутера в цепочке. Того, который подключён непосредственно к интернету. STUN сервер в ответном сообщении нам присылает соответствующие данные. Далее мы пользуемся одной лазейкой - из-за недостатка ip адресов если мы очень быстро после получения ответа от STUN сервера отправим пакет на другой адрес, то он скорее всего пойдёт с той же пары ip:port всех роутеров в цепочке - а значит и последнего. При этом в таблице маршрутизации роутера создаётся запись, что был отправлен пакет на ip2:port2. И если нам потом оттуда пришлют ответ, то он пройдёт. Чтобы оппонент знал, куда его присылать, я помещаю мой ip:port в DHT. И помещаю не просто так, а под определённым ключом. Чтобы узнать мой ip:port, оппонент должен знать мой ключ - поиск в DHT осуществляется именно по ключам, а не по информации, которая под ними хранится. И здесь наступает "затык". Допустим, я хочу добавить вас в друзья. Поиск по имени, фамилии или псевдониму я провести не могу, мне в любом случае нужно знать ваш ключ. Можно придумать систему, как в vc например: пользователи оставляют свои заявки на добавление в друзья. Т.е. я выкладываю в DHT, допустим, три ключа, которые буду мониторить, а желающие будут оставлять под ними значения своих ключей. Но тут сразу же несколько "но". Во-первых, желающим всё равно нужно как-то узнать мой ключ. Во-вторых, код открытый и никто не мешает написать какому-нибудь шутнику небольшую программку, которая будет постоянно "забивать" ваши заявочные ключи мусором, не давая другим что-либо под ними поместить. В третьих, в DHT обычно множество узлов, и ответы от них сыплются абы как, в произвольном порядке. Можно организовать анонимную пересылку между всеми пользователями таблиц вида "ключ1 желает добавить в друзья ключ2". Но, во-первых, пока сеть не очень широкая, этот способ ненадёжный, во-вторых - сеть может фрагментироваться (по кругу общения), в третьих - всё равно нужно знать ключ того, кого хочешь добавить в друзья. В общем, всё упирается в то, что нужно организовать поиск в сети DHT по значению, а не по ключу. В торрентовской DHT, которая используется в Коммунисте, этого сделать нельзя, на сколько мне известно. Можно написать свою реализацию, но тут нужно тогда подымать сервер для первичного подключения с прямым доступом в интернет. А у меня нет такой возможности. Ну и отказоустойчивость сети снизится. Сервер - это определённые адрес и порт, которые можно заблокировать. Торрентовская же сеть DHT узлов очень широкая, вероятность блокировки всех узлов гораздо ниже. Добавлю также, что всё, написанное выше, относится к ipv4. С ipv6 всё поинтереснее - не нужен STUN сервер например. Но не знаю как в мире, а у нас с ipv6 сетями проблемы. У пользователей со стационарным интернетом я их не видел (но у меня в этом плане "охват" не очень широкий). У мобильных операторов на удивление есть (не буду называть конкретные компании, кто захочет - сам найдёт). Да и от DHT и поиска по ней всё равно не уйти.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #6 : 23.05.2022 21:12:28 »
как ищутся сиды в торрент клиентах
Сиды в торрент клиентах ищутся по инфо-хэшам раздач. Т.е. по 160-bit ключам. И в ответ на запрос, запрашивающий получает лишь список пар ip:port сидов. При этом инфо-хэш раздачи нужно знать.

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 8 920
    • Email
Re: P2P мессенджер
« Ответ #7 : 24.05.2022 17:29:09 »
Много букафф, но я обязательно прочту. Интересно, спасибо за подробности. Выскажу соображения после того, как переварю написанное :-D

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 8 920
    • Email
Re: P2P мессенджер
« Ответ #8 : 24.05.2022 17:30:48 »
как ищутся сиды в торрент клиентах
Сиды в торрент клиентах ищутся по инфо-хэшам раздач. Т.е. по 160-bit ключам. И в ответ на запрос, запрашивающий получает лишь список пар ip:port сидов. При этом инфо-хэш раздачи нужно знать.
Я намекал на DHT, кажется. Много раз наблюдал картину, когда торрент-трекер недоступен (битый), а торрент тем не менее выкачивается, но тратится больше времени на поиск сидов.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #9 : 24.05.2022 19:19:23 »
 
Я намекал на DHT, кажется. Много раз наблюдал картину, когда торрент-трекер недоступен (битый), а торрент тем не менее выкачивается, но тратится больше времени на поиск сидов.
Ну оно так и работает. Ваш торрент клиент запрашивает в DHT список сидов - их ip:port. Ищутся они по инфо-хэшу - это хэш-сумма торрент файла. Точнее, ищутся не сами сиды, а узел DHT, который имеет такой же (или близкий) идентификатор - идентификатор совпадает или близок к хэшу торрента. Ну а на этом узле хранится список сидов (это если коротко, подробнее - смотрите про то, как работает DHT, а то опять много буков получится  :-D). Узлы DHT работают независимо от трекера. Фактически, каждый торрент-клиент, если на нём включена DHT, является узлом.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #10 : 01.06.2022 15:26:08 »
Сделал версию 1.1.2 Изменения по отношению к версии 1.1:
  • Улучшена работа с IPv6
  • Исправлена работа проверки орфографии при использовании кодировок, отличных от UTF-8
  • Исправлена работа механизма "пробития" в случае симметричного NAT
  • Некоторые другие исправления и улучшения
На момент написания сообщения узел подключения к DHT, установленный по умолчанию, не работает. В связи с этим может потребоваться изменить соответствующую настройку. Некоторые другие узлы можно найти например здесь.

Ссылки на исходный код и обновлённые неофициальные пакеты находятся в первом сообщении темы.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #11 : 08.06.2022 18:35:14 »
Создана версия 1.2
  • Реорганизована систем перевода и проверки орфографии (теперь можно добавлять собственные словари для проверки правописания без изменения исходного кода, см. README.md и README_RU.md)
  • Улучшена работа с памятью, устранены утечки
  • Некоторые другие исправления и улучшения
В случае некорректной работы проверки орфографии после обновления, необходимо зайти в настройки, выбрать нужный язык и применить настройки.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #12 : 16.06.2022 20:19:29 »
Создана версия 1.3
  • Слегка переработан внешний вид
  • Мелкие исправления и улучшения
Ссылки на пакеты и исходный код в первом сообщении темы.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #13 : 24.06.2022 12:33:06 »
Доступна версия 1.4
  • Добавлена возможность выбирать темы оформления (на данный момент доступны две)
  • Добавлена возможность создания собственных тем оформления без изменения исходного кода
  • Исправления и улучшения
Ссылки на репозитории с исходным кодом и пакеты для дистрибутивов на базе p10 находятся в первом сообщении темы.

Оффлайн ProfessorNavigator

  • Давно тут
  • **
  • Сообщений: 116
Re: P2P мессенджер
« Ответ #14 : 26.06.2022 16:11:28 »
Доступна версия 1.4.1
  • Небольшие исправления перевода
Ссылки на репозитории с исходным кодом и пакеты для дистрибутивов на базе p10 находятся в первом сообщении темы.