2009-04-21 8 views
5

tengo que crear el servidor de conexión < => cliente. Yo uso este código: Servidor:Python + sockets

import socket 

HOST = 'localhost' 
PORT = 50007  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if not data: break 
    conn.send(data) 
conn.close() 

Cliente:

import socket 

HOST = 'localhost' 
PORT = 50007    
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.send('Hello, world') 
data = s.recv(1024) 
s.close() 
print 'Received', repr(data) 

funciona bien! Pero si el servidor se crea en la computadora que no tiene enrutador. Si tiene enrutador, antes de crear el servidor, debe abrir el puerto 50007 en su módem. ¿Cómo puedo crear un servidor en todas las computadoras sin la habilitación de puertos? Los clientes de Torrent lo hacen de alguna manera. Gracias.

Respuesta

7

La pregunta es un poco confusa, pero intentaré ayudar. Básicamente, si el puerto (50007) está bloqueado en la máquina del servidor por un firewall, NO podrá realizar una conexión de tcp desde el cliente. Ese es el propósito del firewall. Muchos protocolos (SIP y bittorrent por ejemplo) usan firewall y estrategias de navegación NAT, pero ese es un tema complejo que puede get more information on here. Notará que para usar bittorrent de manera efectiva, debe habilitar el reenvío de puertos para NAT y desbloquear rangos de puertos para firewalls. Además, bittorrent usa conexiones tcp para la mayoría de las transferencias de datos. Aquí está la comida para llevar:

En primer lugar, tenga en cuenta que hay dos tipos de conexiones que el programa BitTorrent debe hacer:

  • conexiones HTTP saliente al tracker, por lo general en el puerto 6969.
  • entrante y conexiones salientes a las máquinas pares, generalmente en el puerto 6881 y superiores.
+0

> tiene que habilitar el reenvío de puertos para NAT y desbloquear rangos de puertos para firewalls ¿Puedo hacerlo usando python? O no es parte de programación? – Ockonal

+0

Eso NO sería una cuestión programática, a menos que el firewall estuviera basado en software. Esa es una especie de sys-admin de red. –

2

muy difícil de entender su pregunta ...

(...) Torrent-clientes lo hacen de alguna manera.

El Torrent-clientes pueden hacer esto sólo cuando el router - dispositivo de puerta de enlace de Internet (IGD) - apoya la uPNP protocol. La parte más interesante para su problema es the section about NAT traversal.