conectar dos clientes juntos por un servidor sin reenvío de puertos

Estoy tratando de escribir una aplicación que realiza las siguientes acciones:

  1. cliente (1) se conecta a un servidor y elige otro cliente (2) de una lista
  2. servidor conecta a los clientes (1) y (2) juntos (no hay reenvío de puertos involucrados)

¿Cómo conectar dos clientes entre sí directamente, utilizando un servidor que conoce sus direcciones, puertos y tiene una conexión abierta a ambos?

En muchos posts sobre p2p hay declaraciones, que es posible y un escenario común, pero estoy luchando para encontrar una explicación de cómo se hace.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por cyberjedi


3 Respuestas:

  • Lo que estás describiendo es una conexión directa entre pares (p2p). Para que funcione en condiciones normales, sin necesidad de reenvío de puertos, o más avanzado NAT traversal techniques (golpe de agujeros, STUN, etc), el servidor tendrá que facilitar una negociación entre los clientes, donde un cliente acepta abrir una toma de escucha a la que el otro cliente intentará conectarse. Si esa conexión falla, los clientes pueden revertir roles e intentar de nuevo en la otra dirección. Mientras al menos 1 cliente no esté detrás de un NAT, esto normalmente funcionará. Pero si esa conexión también falla, la comunicación adicional entre los clientes tendrá que pasar por el servidor como un proxy, a menos que se utilicen técnicas más avanzadas.

    Respondida el Dec 17, 2020 a las 07:02 - por debugdynamob312

    Votos positivos: 0 | Votos negativos: 0

  • Lo que estás intentando hacer es establecer una comunicación punto a punto entre dos clientes a través de un servidor intermediario. Para lograr esto, puedes seguir estos pasos:

    • Cliente 1 se conecta al servidor y envía su información al mismo (dirección IP, puerto, etc.).
    • El servidor mantiene una lista de clientes conectados y sus direcciones.
    • Cliente 1 elige Cliente 2 de la lista disponible en el servidor.
    • El servidor entonces envía la información de Cliente 2 a Cliente 1.
    • Cliente 1 y Cliente 2 utilizan la información proporcionada por el servidor para establecer una conexión directa entre ellos (sin reenvío de puertos).

    Para lograr este escenario, es necesario que Cliente 1 y Cliente 2 implementen la lógica para conectarse directamente entre sí utilizando la información proporcionada por el servidor. Esto podría implicar realizar una conexión saliente desde Cliente 1 a Cliente 2 utilizando la dirección IP y el puerto proporcionados por el servidor.

    Es importante tener en cuenta que, en algunos casos, dependiendo de la red y la configuración de seguridad, es posible que la conexión directa entre los clientes no sea posible sin reenvío de puertos. En esos casos, puedes considerar alguna solución alternativa como el uso de un servidor de retransmisión para facilitar la comunicación entre los clientes.

    Espero que esta información te ayude a entender cómo puedes conectar dos clientes directamente a través de un servidor. Si tienes más preguntas o necesitas más detalles sobre la implementación, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 07:06 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Paso 1: Establece una conexión entre el cliente 1 y el servidor

    El cliente 1 se conecta al servidor utilizando un socket TCP. El servidor acepta la conexión del cliente 1 y crea un socket para comunicarse con él.

    Paso 2: Establece una conexión entre el cliente 2 y el servidor

    El cliente 2 se conecta al servidor utilizando un socket TCP. El servidor acepta la conexión del cliente 2 y crea un socket para comunicarse con él.

    Paso 3: Intercambia información de conexión

    El servidor envía la dirección IP y el puerto del cliente 1 al cliente 2. El servidor envía la dirección IP y el puerto del cliente 2 al cliente 1.

    Paso 4: Establece una conexión directa entre los clientes

    El cliente 1 utiliza la información de conexión recibida del servidor para abrir un socket TCP y conectarse directamente al cliente 2. El cliente 2 utiliza la información de conexión recibida del servidor para abrir un socket TCP y conectarse directamente al cliente 1.

    Código de ejemplo (en Python):

    Servidor:

    python
    import socket
    
    

    Crea un socket servidor

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 12345))

    El servidor se ejecuta en localhost:12345

    server_socket.listen()

    Acepta conexiones de ambos clientes

    client1_socket, client1_addr = server_socket.accept() client2_socket, client2_addr = server_socket.accept()

    Intercambia información de conexión

    client1_socket.send(client2_addr) client2_socket.send(client1_addr)

    Cliente 1:

    python
    import socket
    
    

    Crea un socket cliente

    client1_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client1_socket.connect(('localhost', 12345))

    El cliente 1 se conecta al servidor

    Recibe información de conexión del cliente 2 del servidor

    client2_addr = client1_socket.recv(1024) client2_addr = client2_addr.decode()

    Establece una conexión directa con el cliente 2

    client1_socket.connect((client2_addr, 12346))

    El cliente 2 se asume que está en el puerto 12346

    Cliente 2:

    python
    import socket
    
    

    Crea un socket cliente

    client2_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client2_socket.connect(('localhost', 12345))

    El cliente 2 se conecta al servidor

    Recibe información de conexión del cliente 1 del servidor

    client1_addr = client2_socket.recv(1024) client1_addr = client1_addr.decode()

    Establece una conexión directa con el cliente 1

    client2_socket.connect((client1_addr, 12347))

    El cliente 1 se asume que está en el puerto 12347

    Nota:

    En este ejemplo, se asume que el cliente 2 está en el puerto 12346 y el cliente 1 está en el puerto 12347. Puedes ajustar estos puertos según sea necesario. El servidor solo facilita el intercambio de información de conexión. Una vez que los clientes tienen esta información, pueden establecer una conexión directa entre sí.

    Respondida el Dec 18, 2020 a las 07:15 - por Gemini

    Votos positivos: 0 | Votos negativos: 0