p2p соединения за серыми айпишниками

Описание: Программирование на супер модном мега крутом языке Питон.

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3652
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#1 dyvniy » Вт, 27 февраля 2024, 18:29:29

Тут я хочу сохранять материалы по данной технологии.

Самоочевидное
https://qna.habr.com/q/1100494
Спойлер
Могут ли p2p сети работать, если все пользователи имеют серые IP?
Верно ли я понимаю, что распределенная сеть на любом протоколе, работающем только через интернет (без серверов), не может функционировать, если у всех участников этой сети серые (не видные из внешнего интернета, находящиеся за роутером провайдера) ip адреса?

Интересует вариант только без серверов. В т.ч. без сигнальных серверов и других "опор", без проброса портов и каких либо других преобразований способа подключения участников к интернету.
Вопрос задан более двух лет назад 751 просмотр
Подписаться 4 Простой 1 комментарий
Пригласить эксперта
ОТВЕТЫ НА ВОПРОС 8
rPman @rPman
Вообще без каких либо опор с белыми ip.
тогда не смогут
tcpip требует чтобы кто то к кому то по ip адресу подключился

но возможна ситуация когда с однократно с помощью белого ip клиент подключился к другому клиенту, который открыл порты на роутере с помощью upnp, запомнил всех таких клиентов и передал весь их список (id_client:ip:port) всем клиентам.

Если оперативно передавать информацию об изменениях ip адресов клиентов (такие клиенты все еще помнят адреса других и при смене своего адреса тут же сообщают об этом другим) то это облако клиентов сможет существовать в принципе без сигнального сервера (точнее сигнальными серверами могут являться другие клиенты)

Если клиент на долго отключится от этой сети, может получиться что все другие клиенты сменят ip адрес и ему некуда будет подключаться, но чем больше клиентов в сети тем больше шансов что появится клиент с постоянным ip адресом.

p.s. udp подключение позволяет подключиться к чужому подключению без наличия на роутере поддержки upnp
Ответ написан более двух лет назад
Нравится 2 Комментировать
CityCat4 CityCat4 @CityCat4
Внимание! Изменился адрес почты!
Очередной построитель независимого протестного мессенджера? :D

Нет, не смогут.

Казахская практика показала, что единственным "мессенджером", который сложно взять под контроль, являются портативные рации :)
Ответ написан более двух лет назад
Нравится 2 8 комментариев
ValdikSS ValdikSS @ValdikSS
Прямое соединение двух клиентов за NAT'ами, если хоть один из них не симметричный (symmetric nat), возможно с помощью UDP и TCP hole punching, но для этого нужно знать IP-адреса и порты обеих сторон.

Также существует способ определения IP-адреса клиента сервером — ICMP Hole Punching, реализованный в программе pwnat, но отправка пакета клиентом требует администраторских прав на устройстве, а также пакет может отбрасываться некоторыми файрволлами.

Могут ли p2p сети работать, если все пользователи имеют серые IP? Да, могут, но не всегда и не настолько стабильно, нежели при полноценном прямом подключении.
Ответ написан более двух лет назад
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3652
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#2 dyvniy » Чт, 7 марта 2024, 16:43:18

Этот код не работает, но я похожий отлаживал. Надо найти.

Код: Выделить всё

import socket

class P2PDataExchange:
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
       
    def find_peers(self):
        peers = []
        self.socket.bind(('', 6000))
        self.socket.listen(1)
        while True:
            connection, addr = self.socket.accept()
            print("Connected to ", addr)
            peers.append(addr)
            connection.send("Hello!".encode())
            connection.close()
           
    def send_data(self, data):
        for peer in peers:
            self.socket.sendto(data, peer)
   
    def receive_data(self):
        received = b""
        while True:
            data = self.socket.recv(1024)
            if not data:
                break
            received += data
       
        return received.decode()

if __name__ == "__main__":
    p2p = P2PDataExchange()
    p2p.find_peers()
    data = input("Enter the data to send: ")
    p2p.send_data(data.encode())
    print(p2p.receive_data())
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3652
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#3 dyvniy » Вс, 10 марта 2024, 22:12:43

Неплохое решение. Работает. Но разве это р2р ?
https://codeease.net/programming/python/Python-websocket-server-multiple-clients
server

Код: Выделить всё

import asyncio
import websockets
# Store all connected clients
connected_clients = set()
async def handle_client(websocket, path):
    # Add the client to the connected_clients set
    connected_clients.add(websocket)
    print(f"New client connected. Total clients: {len(connected_clients)}")
    try:
        while True:
            # Receive message from the client
            message = await websocket.recv()
            print(f"Received message from client: {message}")
            # Send the received message to all connected clients
            for client in connected_clients:
                await client.send(message)
    except websockets.exceptions.ConnectionClosedOK:
        # Remove the client from the connected_clients set
        connected_clients.remove(websocket)
        print(f"Client disconnected. Total clients: {len(connected_clients)}")
# Start the WebSocket server
start_server = websockets.serve(handle_client, "localhost", 8000)
# Run the event loop
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

client

Код: Выделить всё

import asyncio
import websockets
async def send_message():
    async with websockets.connect("ws://localhost:8000") as websocket:
        while True:
            message = input("Enter a message to send: ")
            await websocket.send(message)
# Run the event loop
asyncio.get_event_loop().run_until_complete(send_message())
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3652
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#4 dyvniy » Вт, 12 марта 2024, 16:46:31

Посмотреть порты в линуксе

Код: Выделить всё

 sudo netstat -tulpn | grep :88


Вроде это решение работает
https://github.com/dyvniy/python-p2p-network
но с подключением к дементоровскому серваку пока проблемки.
Хотя бы один нормальный сервер нужен для старта сети.

На дементоровском работает, но только к нему и от него.
Полноценных р2р соединений из разных подсетей не происходит.
Что за х. Может питончик неосилит такое?
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3652
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#5 dyvniy » Пт, 15 марта 2024, 13:43:28

Storm botnet network - извесный ботнет.
Вроде лишь ботнеты труЪ р2р
Изображение


Название раздела: Python
Описание: Программирование на супер модном мега крутом языке Питон.

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Python»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 1 гость