2016-03-21 21 views
7

Tôi bắt đầu một máy chủ bằng cách sử dụng ổ cắm và muốn cho phép khách hàng kết nối với nó.Chuyển tiếp cổng trong python để cho phép các kết nối ổ cắm

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) 

Bây giờ, để các khách hàng khác kết nối tôi có cổng chuyển tiếp thủ công và hoạt động tốt. enter image description here

Tôi muốn thực hiện điều này theo cách tự động. -> Tôi cố gắng 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 

Nó sẽ mở cổng được hiển thị trong hình bên dưới. Nhưng danh sách chuyển tiếp cổng được hiển thị trong hình ảnh đầu tiên trống. Nó không hoạt động và khách hàng không thể kết nối. Làm thế nào tôi có thể sửa lỗi này? Tôi đang thiếu gì? enter image description here

+0

Bạn có thể kết nối cục bộ không? –

+0

@BrianCain Có, sử dụng 127.0.0.1 trên cùng một máy. –

+1

Tôi nghĩ rằng "danh sách chuyển tiếp cổng trong hình ảnh đầu tiên" chỉ hiển thị ánh xạ thủ công. –

Trả lời

-3

đây là câu hỏi thú vị. từ những gì tôi có thể triệu tập Tôi nghĩ rằng

GUI cho thấy rằng các quy tắc chuyển tiếp cổng UPNP được thêm vào. vì vậy Rất có thể có sự cố trong cấu hình UPNPC. Tôi nghi ngờ bạn đang làm điều này trên Router hoặc nền tảng tương tự với X-WRT hoặc OpenWRT

vấn đề tôi nghĩ là bạn không thể sử dụng upnp cho việc này hoặc nó không hoạt động vì một số lý do lạ.

Tôi đề nghị bạn thử thư viện này pytables.

Tôi biết bạn muốn biết lý do và tôi đang tìm cách giải thích lý do.

này chỉ dành cho bạn để có được đi vào dự án này

và cho giải pháp nhanh chóng

Hãy thử điều này

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

Xin chào và điều này đã sẵn sàng thực hiện mã tôi tìm thấy nó [ở đây] (http://stackoverflow.com/questions/20734319/how-to-write-specific-iptables-rules-using-python-iptables). 'nhập quy trình con p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport ", "22", "-j", "CHẤP NHẬN"], stdout = subprocess.PIPE) đầu ra, err = p.communicate() đầu ra in' – Devidas

+2

Vui lòng sửa câu trả lời của bạn để bao gồm mã hoặc những thứ khác trả lời câu hỏi, thay vì tacking vào một bình luận. – Ajean

+0

@Devidas Xin chào, thx đã trả lời! Tôi đã thử mã của bạn, nó mang lại cho tôi lỗi này: '>>> p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport "," 22 "," -j "," ACCEPT "], stdout = subprocess.PIPE) ' Traceback (cuộc gọi gần đây nhất): Tệp "", dòng 1, trong file "c: \ Anaconda \ lib \ subprocess.py", dòng 710, trong __init__ errread, errwrite) file "c: \ Anaconda \ lib \ subprocess.py", dòng 958, trong _execute_child startupinfo) WindowsError: [Lỗi 2] Hệ thống không thể tìm thấy tệp được chỉ định'. Xin vui lòng cho tôi biết trong trường hợp tôi đang thiếu một cái gì đó. –

4

Tôi nghĩ rằng bạn đã thực hiện một sai lầm sử dụng upnp.lanaddr như địa chỉ nội bộ-host. upnp.lanaddr là địa chỉ của thiết bị upnp là bộ định tuyến của bạn, bạn muốn sử dụng địa chỉ cục bộ của máy chủ.

Nếu cần, hãy xem Finding local IP addresses using Python's stdlib nếu bạn muốn tự động nhận IP cục bộ của máy chủ.

0

Tôi nghĩ rằng chúng tôi đang thiếu rất nhiều thông tin liên quan để biết vấn đề chính ở đây là gì. Tôi thấy rất nhiều người đoán.

Bằng cách này, chỉ cần chỉnh sửa dòng

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

result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '') sẽ cho bạn biết nếu nó hoạt động ở tất cả. Thực hiện kiểm tra cổng từ máy chủ cục bộ, nó giả, bạn không ở dưới bộ định tuyến.

Ngoài ra, hãy nhớ sử dụng tính năng Thử/Ngoại trừ các khối để cho bạn biết có gì sai trên mã của bạn.

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

Một cách khác, không phải là thời trang là sử dụng tự động hóa html/web, thậm chí cURL để thực hiện các yêu cầu đó thay vì sử dụng uPnp, theo cách này bạn không thực sự cần xử lý.

Các vấn đề liên quan