Видел исходники клиентов и серверов - они все работают в локальной сети. Если подставить интернет адрес который высвечивается на странице http://myip.ru/ то будет ошибка (The requested address is not valid in its context) WinApi функция bind биндит только локальные адреса. Как сделать чтобы с интернет адресом работало?
Биндить нужно на локальный адрес и пробрасывать порт в настройках роутера(либо заказывать проброс порта в провайдера) на комп в локальной сети. Проверять можно тут: http://ping.eu/port-chk/
а как тогда P2P клиенты работают без всяких пробросов портов (связываются даже без промежуточных серверов)?
у мнея даже в виртуальной машине активное соединение работает (мостом надо ставить в настройках сети), но свой сервер на интернет адрес биндится не хочет ...
Почему бы не почитать документацию к функции bind? https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms737550(v=vs.85).aspx The bind function associates a local address with a socket. --- WSAEADDRNOTAVAIL - This error is returned if the specified address pointed to by the name parameter is not a valid local IP address on this computer.
Какой именно вопрос? По моим ссылкам есть ответы на Ваши вопросы. Незаметно, ибо Вы дальше пытаетесь биндить сокет на внешний IP.
биндить на не локальный IP не получится - это из самого первого вопроса понятно. Как P2P клиенты умудряются принимать входящие соединения не в своей подсети?
Если понятно, то зачем второй раз в теме сообщать, что у Вас не получается биндить сокет на внешний адрес? Если P2P клиент за NAT без проброса портов - то никак. Если "на пальцах", то как-то так. Допустим есть P2P клиент который сидит за NAT без проброса портов с включенным DHT. У него есть файл, который он поставил раздавать. Казалось бы, с него не смогут скачать, ибо к нему не дойдет входящее соединение. Но на самом деле с него смогут качать по следующей схеме. Он обращается на трекер в поисках пиров. Трекер сообщил P2P клиенту адрес и порт одного пира. У этого пира порты проброшены и P2P клиент подключается к нему, получает инфу про других участников обмена файлом(спасибо DHT) и пытается так же подключится к ним. По созданному соединению пир качает файл с P2P клиента.
Если схемка такая: То необходимо биндить на локалку + пробросить порты. А вот если такая: То только лишь покупать белый ip - обычно провайдеры имеют эту услугу.
то что с пробросом портов работает уже знаю (даже проверил что работает) но вотъпрос стоял что и без проброса портов P2P клиенты работают в лакальной сети - как такое сделать? Захожу в модем в маршруты UPnP и при запуске DC там появляются маршруты (как такое сделать?)
нашёл https://upnp-portmapper.sourceforge.io/#download - занятно как написать такую программу (без библиотек)
Первый Skype умел пробиваться через NAT, это точно, но я до сих пор не понимаю - как? Как клиенты работали напрямую, без сервера? Ну не совсем без сервера, но там только начальный коннект устанавливался через сервер, а дальше всё шло напрямую! Инфа сотка.