2013-01-23 63 views
9

Tôi đang tạo một ứng dụng Python yêu cầu người dùng phải có cổng được chuyển tiếp tới máy tính của mình để giao tiếp với máy chủ hoặc người dùng khác. Việc triển khai hiện tại hoạt động khá tốt, nhưng điều duy nhất là người đang chạy tệp phải chuyển tiếp cổng tới IP cục bộ theo cách thủ công. Tôi muốn tự động hóa điều này. Anh ta chọn một cổng, kịch bản kiểm tra xem nó có thể được chuyển tiếp hay không, sau đó nó chuyển tiếp nó. Nếu không, nó sẽ xử lý lỗi tương ứng.Chuyển tiếp cổng qua UPnP bằng Python

Tôi đã xem xét một số thư viện tuyên bố rằng chúng có thể thực hiện điều này bằng Python thuần túy (vì tôi sẽ cần biên dịch sang .exe [...] sau khi hoàn thành) nhưng không tìm được gì hữu ích. Nếu bạn có thể cung cấp cho tôi một mẫu mã về cách cố gắng chuyển tiếp một cổng và xử lý thành công/thất bại tương ứng, điều đó sẽ rất tuyệt.

Cảm ơn trước về thời gian của bạn.

PS: Đó là Python 2.7.X mà tôi đang nhắm mục tiêu

+0

P.S .: Các ứng dụng sẽ được phát triển trên máy Mac và sau đó thử nghiệm trên một máy tính Windows. Nếu nó hoạt động, nó sẽ được biên dịch và triển khai cho tất cả các nền tảng. – DaKnOb

+0

Tôi đã nhìn vào cùng một điều, tiếc là tôi chỉ tìm thấy [Brisa] (http://stackoverflow.com/q/4742001/897968) và [MiniUPNP] (http://stackoverflow.com/a/10440556/897968) cho đến nay ... chắc chắn phải có một triển khai Python hiện tại/nhỏ gọn/tinh khiết hơn? Bất kỳ ai? – FriendFX

+0

Tìm giải pháp đa nền tảng tại đây. –

Trả lời

0

Hình như có một vài lựa chọn:

Có một ví dụ hay về pytho n các ràng buộc cho GNUPnP được sử dụng để mở các cổng trên bộ định tuyến here. Trong ví dụ đó thời gian thuê được đặt thành 0, không giới hạn. Xem here để biết định nghĩa của add_port.

Một ví dụ đơn giản có thể là:

#! /usr/bin/python 
import gupnp.igd 
import glib 
from sys import stderr 

my_ip = YOUR_IP 

igd = gupnp.igd.Simple() 
igd.external_ip = None 

main = glib.MainLoop() 

def mep(igd, proto, eip, erip, port, localip, lport, msg): 
    if port == 80: 
     igd.external_ip = eip 
     main.quit() 

def emp(igd, err, proto, ep, lip, lp, msg): 
    print >> stderr, "ERR" 
    print >> stderr, err, proto, ep, lip, lp, msg 
    main.quit() 

igd.connect("mapped-external-port", mep) 
igd.connect("error-mapping-port", emp) 

#igd.add_port("PROTO", EXTERNAL_PORT, INTERNAL_IP, INTERNAL_PORT, LEASE_DURATION_IN_SECONDS, "NAME") 
igd.add_port("TCP", 80, my_ip, 8080, 86400, "web") 

main.run() 
Các vấn đề liên quan