Programación de red Python (vincular a dirección externa)
Frecuentes
Visto 2,315 veces
1
Soy un novato en python, y hace solo unos días comencé a probar la programación de redes (también soy un novato allí)
Ahora encontré un buen programa de servidor de cliente que se ejecutaba de manera bastante simple en mi computadora, pero cuando reemplacé las direcciones locales y le dije a mi amigo que ejecutara el script del cliente, simplemente no respondió.
Mi dirección IP global: 120.59.XX.XXX
Mi dirección Ipv4 devuelta por ipconfig: 192.168.1.2 (estoy conectado a Internet a través de un enrutador)
Mi dirección de puerta de enlace: 192.168.1.1
Puerto usado: 1060 (Probé este puerto localmente y no estaba en uso)
#server.py
import socket
import sys
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
server.bind(('192.168.1.2', PORT))
print 'Listening at', server.getsockname()
while True:
data, address = server.recvfrom(MAX)
print 'The client at', address, 'says', repr(data)
server.sendto('Your data was %d bytes' % len(data), address)
Codigo del cliente :
#client.py
import socket
import sys
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
PORT = 1060
MAX = 65536
client.sendto('Hello Server!', ('120.59.XX.XXX', PORT))
data, address = client.recvfrom(MAX)
print 'The server', address, 'says', repr(data)
Inicié server.py en mi computadora y le dije a mi amigo que iniciara client.py, permití las conexiones entrantes a python a través del firewall, también agregué el puerto 1060 a la lista de conexiones entrantes de Windows.
Todavía no responde, y no puedo descifrar por qué (tengo una dirección IP dinámica, pero para la sesión actual permanece constante y, por lo tanto, debería funcionar, también 1060 es un puerto conocido y no debería ser un problema, ¿verdad? )
2 Respuestas
1
¡Necesita agregar una regla de reenvío de puertos en su enrutador! algo así como desde el puerto 1060 hacia adelante hasta el puerto 192.168.1.2 1060.
contestado el 22 de mayo de 12 a las 16:05
1
Tu necesitas un reenvío de puerto en el enrutador, que reenviaría las conexiones a la dirección externa (global) del enrutador en el puerto 1060 a la IP de su escritorio 192.168.1.2
puerto 1060.
contestado el 22 de mayo de 12 a las 16:05
Ok, pero si uso un puerto bien conocido, ¿debería funcionar entonces? Porque usé 80 (sé que no debería) y aún así no funcionó. - Kartik Anand
Los puertos bien conocidos como el 80 y el 25 a menudo son bloqueados por los ISP en la entrada. Use un puerto de número alto aleatorio como 42424. - Nikolái Fetissov
Reenvié 1060 a 192.168.1.2 mi IP local y todavía no funciona. - Kartik Anand
El enrutador puede asumir TCP cuando realiza el reenvío de puertos. Vea si hay una opción allí para habilitar UDP, lo que está tratando de hacer. - Nikolái Fetissov
Otras dos cosas para verificar: si el firewall local en la PC con Windows permite la entrada de udp: 1060, y si tiene alguna capacidad de registro en ese enrutador, vea si realmente está recibiendo esos paquetes de su amigo (pueden ser filtrados / soltados en otro lugar) . - Nikolái Fetissov
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python networking or haz tu propia pregunta.
sí, esto es lo que pensé al principio, pero entonces, ¿cómo es que utorrent puede usar puertos sin que yo los reenvíe? y 1060 es bien conocido por SAP: Kartik Anand
Se apaga conectándose a un servidor en algún lugar, es decir, la conexión TCP se inicia desde su PC. - Nikolái Fetissov
Las técnicas NAT a menudo funcionan de manera inteligente. Si una máquina dentro de la red local inicia una conexión, la mayoría de las implementaciones de NAT asignan la respuesta a esta máquina. Si una conexión se inicia desde el exterior, llega inesperadamente (desde el punto de vista del "router"). Si no hay una regla especificada sobre cómo manejar una conexión tan inesperada (como una regla de reenvío de puerto), el enrutador rechaza la conexión. - Dr. Jan Philip Gehrcke
Entonces, si pudiera engañar al enrutador, me refiero a enviar un mensaje aleatorio (o vacío) a cualquier URL por UDP, obtener mi número de puerto aleatorio (que OS asignaría) y luego vincular mi servidor a ese número de puerto. ¿Funcionará? - Kartik Anand