Войти
ПрограммированиеФорумСеть

Организация P2P соединения

#0
19:46, 30 мар. 2020

  Как понятно из заголовка, задача - организовать P2P соединение через интернет.
На текущий момент имеется (не очень качественный) код, исполнение которого можно настроить в режим приёма и передачи 2 байт номера пакета по протоколу UDP. Для этого выводится локальный и внешний (определяется через STUN) адрес у сервера, и переносится (копированием из консоли в консоль) клиенту.
  После тестов выяснилось, что соединение происходит только при подключении через локальную сеть (а при вводе внешнего ip:port ничего не проходит), так-же предпринималась попытка сканирования портов простым перебором, но неудачно (вероятно блокируется провайдером, или недоходит из-за неизвестной ошибки).

  Пожалуйста, помогите исправить проблему недохода пакетов, или подскажите где можно найти решение.

  Собственно Код:

+ Показать

  Описание использования приложенного выше кода:
После запуска программы, появляется возможность ввода 1, либо 0 (другие варианты конвертируются в этот формат).
  При вводе "0" программа выводит локальный адрес и расчётный (для сервера) порт. И ждёт ввода адреса для подключение, он вводится в формате 5 чисел разделённых пробелом (к примеру "1 2 3 4 60000", что соответствует iport 1.2.3.4:60000). Далее выводится подтверждение введённого адреса и начинается отправка пакетов, при этом выводится сообщение о номере текущего отправленного пакета и результат отправки (возвращённое значение функции отправки).
  При вводе "1" программа выводит локальный адрес и расчётный (для сервера) порт, ошибку привязки сокета к порту (если не равно нулю, то сокет привязан к другому порту), внешний iport (в формате 5 чисел разделённых запятой). Начинается приём. И периодически повторяется запрос на STUN и вывод внешнего iport.


#1
20:12, 30 мар. 2020

Тут возникает вполне резонный вопрос - для чего вам это? Если вы рассчитываете сделать полноценную сеть через интернет при помощи п2п - у меня для вас плохие новости. Во-первых это не будет работать без белых адресов. Во-вторых вам придется уговаривать провайдера не блокировать порты. На практике 99% провайдеров отправят вас в лес и слушать не будут. Поэтому вам придется организовать свой сервер для синхронизации и вообще соединения клиентов между собой. Других вариантов просто нет.

#2
20:34, 30 мар. 2020

Bioman
> для чего вам это?
Что-бы понять как это работает, и организовывать подобную связь.
> это не будет работать без белых адресов.
Я знаю, но посмотреть будет-ли вообще работать, или переслать адрес через какой-нибудь месенжер другу хватит.
> вам придется уговаривать провайдера не блокировать порты
Вы имеете ввиду, что провайдер может блокировать открытое соединение?

#3
14:07, 31 мар. 2020

hlpis
> Что-бы понять как это работает, и организовывать подобную связь.
Ну понять,как оно работает не проблема. А сделать,чтобы оно работало через интернет,без использования внешних нод для синхронизации - практически нереально.
hlpis
> Я знаю, но посмотреть будет-ли вообще работать, или переслать адрес через
> какой-нибудь месенжер другу хватит.
Скорее всего вы столкнетесь в рядом проблем. Большая из которых - провайдер. Надо оно вам или нет - думайте сами. Если не хотите гемора - используйте эмулятор локальной сети через интернет,вроде хамачи и тому подобных. Так,по-крайней мере у вас проблем с этим не будет. И будет узел,который будет перенаправлять запросы пользователей между собой.
hlpis
> Вы имеете ввиду, что провайдер может блокировать открытое соединение?
Типичная практика. Большинство провайдеров вообще блокируют все,что только можно. При этом у многих все блокировки настолько через задницу сделаны,что они их просто не могут убрать. Потому что они для всего узла идут. В любом случае самые безболезненные варианты решения - это либо использовать эмулятор,либо использовать хостинг/виртуалку/облако для узла синхронизации и через него пользователей между собой связывать. С домашнего интернета получится или нет - всецело зависит от раздолбайства конкретного провайдера. Попробовать можете,но гарантий никто в этом плане вам не даст. Классическая отмазка - нет технической возможности и хоть ты тресни.

#4
15:50, 31 мар. 2020

Bioman
> Скорее всего вы столкнетесь в рядом проблем. Большая из которых - провайдер.
> Надо оно вам или нет - думайте сами.
Надо.
Bioman
> Типичная практика. Большинство провайдеров вообще блокируют все,что только
> можно.
Я проводил тест около часа, используя выше предложенный код (каждые 5 секунд отправлялся запрос к STUN), за это время провайдер ни разу не сменил порт. И если мне просто повезло, то часа на поиграться хватит. Да и торрент же как-то работает.

#5
15:51, 31 мар. 2020

hlpis
> После тестов выяснилось, что соединение происходит только при подключении через
> локальную сеть
Чтобы это сработало через интернет оба компьютера должны одновременно "долбиться" друг к другу. То есть сервер тоже должен пытаться отправить что-то клиенту, прочитай как работает NAT. Это сработает в ~90% случаев, но для чего-то серьезного полагаться на это нельзя.

#6
17:05, 31 мар. 2020

Спасибо, работает!

Apfel1994
> сработает в ~90% случаев
А что делать в оставшихся ~10%?

#7
17:16, 31 мар. 2020

hlpis
> А что делать в оставшихся ~10%?
Смотря что за приложение. Если это что-то вроде чата, то использовать сервер с выделенным IP для ретрансляции пакетов между клиентами, если они не смогли достучаться друг до друга напрямую. Сервер нужен в любом случае, чтобы клиенты обменялись адресами.
В играх с лобби выбирается один игрок, к которому смогло подключиться большинство.

#8
18:53, 31 мар. 2020

Всем спасибо, проблема решена.
Правильный код:

+ Показать

ПрограммированиеФорумСеть

Тема в архиве.