2016-03-21 4 views
7

Я запускаю сервер, используя сокеты, и хочу, чтобы клиенты могли подключаться к нему.Пересылка портов в python для разрешения соединений сокетов

self.sock.bind(('0.0.0.0',0)) # 0.0.0.0 will allow all connections and port 0 -> os chooses a open port. 
stroke_port=self.sock.getsockname()[1] 
self.sock.listen(75) 
self.open_port_popup(stroke_port) 

Теперь для подключения других клиентов у меня есть порт, который пересылает его вручную, и он отлично работает. enter image description here

Я хочу сделать это автоматическим способом. -> Я стараюсь upnp.

import miniupnpc 

def open_port(port_no): 
    '''this function opens a port using upnp''' 
    upnp = miniupnpc.UPnP() 

    upnp.discoverdelay = 10 
    upnp.discover() 

    upnp.selectigd() 

    # addportmapping(external-port, protocol, internal-host, internal-port, description, remote-host) 
    result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '') 
    return result 

Он открывает порт, показанный на картинке ниже. Но список переадресации портов, показанный на первом изображении, пуст. Он не работает, и клиенты не могут подключиться. Как я могу это исправить? Что мне не хватает? enter image description here

+0

Можете ли вы подключиться локально? –

+0

@BrianCain Да, используя 127.0.0.1 на одном компьютере. –

+1

Я думаю, что «список переадресации портов на первом изображении» показывает только ручные сопоставления. –

ответ

-3

это интересный вопрос. от того, что я мог бы вызвать Я думаю

GUI показывает, что правила пересылки портов UPNP добавлены. Так что, скорее всего, в конфигурации UPNPC существует проблема. Я сомневаюсь, что вы делаете это на Router или аналогичной платформе с X-WRT или OpenWRT

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

Предлагаю вам попробовать эту библиотеку pytables.

Я знаю, что вы хотели знать, почему, и я работаю над выяснением причины.

это только для вас, чтобы начать работать над этим проектом

и для быстрого решения

Попробуйте

import subprocess 

p = subprocess.Popen(["iptables", "-A", "INPUT", "-p", "tcp", "-m", "tcp", "--dport", "22" , "-j", "ACCEPT"], stdout=subprocess.PIPE) 
     output , err = p.communicate() 
     print output 
+0

Привет, и это готовый код. Я нашел его [здесь] (http://stackoverflow.com/questions/20734319/how-to-write-specific-iptables-rules-using-python-iptables). 'импортный подпроцесс p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport "," «22», «-j», «ACCEPT»], stdout = subprocess.PIPE) output, err = p.communicate() print output' – Devidas

+2

Пожалуйста, отредактируйте ваш ответ, чтобы включить код или другие вещи, которые отвечают вопрос, а не ссылаться на комментарий. – Ajean

+0

@Devidas Привет, THX для ответа! Я пробовал ваш код, он дает мне эту ошибку: '>>> p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport "," 22 "," -j "," ACCEPT "], stdout = subprocess.PIPE) ' 'Traceback (последний последний звонок): Файл« », строка 1, в Файл "C: \ Anaconda \ Lib \ subprocess.py", строка 710, в __init__ errread, errwrite) Файл "C: \ Anaconda \ Lib \ subprocess.py", строка 958, в _execute_child STARTUPINFO) WindowsError: [Ошибка 2] Система не может найти указанный файл'. Пожалуйста, дайте мне знать, если я что-то упустил. –

4

Я думаю, что вы сделали ошибку, используя upnp.lanaddr в качестве адреса внутреннего хоста. upnp.lanaddr - адрес устройства upnp, который является вашим маршрутизатором, вы хотите использовать локальный адрес вашего сервера.

При необходимости взгляните на Finding local IP addresses using Python's stdlib, если вы хотите динамически получить локальный IP-адрес вашего сервера.

0

Я думаю, что нам не хватает много связанной информации, чтобы узнать, в чем главная проблема. Я вижу, как многие люди догадываются.

Кстати, просто редактируя эту строку

result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '') в

result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '') бы сказать вам, если он работает на всех. Выполнение тестирования порта с localhost это манекен, вы не находитесь под маршрутизатором.

Кроме того, не забудьте использовать блоки Try/Except, чтобы сообщить вам, что не так в вашем коде.

try: 
    print "1" + 1 
except Exception as e: 
    print str(e) 

Другой способ, не вылеплены является использование HTML/веб-автоматизации, даже CURL, чтобы сделать эти запросы вместо использования UPnP, таким образом, вы действительно не нужно, чтобы справиться с этим.

Смежные вопросы