2016-07-05 122 views
1

Python新的Python。而且我無法讓服務器同時收聽兩個端口。 這是我寫到目前爲止代碼:Python - 從兩個UDP套接字偵聽的服務器

sock_client1 = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM)   # UDP 
sock_client1.bind((SEND_IP, SEND_CLIENT_PORT)) 
sock_client1.setblocking(0)  

sock_client2 = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM)   # UDP 
sock_client2.bind((SEND_IP, SEND_SERVER_PORT)) 
sock_client2.setblocking(0)    

while True: 
try: 

    ready_client1 = select.select([sock_client1], [], [], None) 
    ready_client2 = select.select([sock_client2], [], [], None) 

    if ready_client1[0]: 

     pkt_recv_raw, addr = sock_client1.recvfrom(4096) 
     port = SEND_CLIENT_PORT 

    if ready_client2[0]: 

     pkt_recv_raw, addr = sock_client2.recvfrom(4096) 
     port = SEND_SERVER_PORT 

當我與客戶一起運行這段代碼,服務器無法接收任何東西。當我僅使用其中一個ready_client時,它才起作用。

在此先感謝!

+0

爲什麼相同的代碼同時監聽客戶端套接字和服務器套接字? – e4c5

+0

@ e4c5對不起,我不確定我是否理解你的問題。也許這會有幫助:這個代碼實際上是一個模塊,應該透明地工作在兩個節點之間的傳輸。它接收它們的數據包並將它們重新發送到真正的目標節點。我需要知道我收到的是誰,然後我可以知道我應該向誰發送數據。由於我在本地模擬它,因此端口號是我用來區分來源的方式。 – user00

+0

在這種情況下,您聽起來像是在試圖重塑iptables或類似的東西。 – e4c5

回答

2
ready_client1 = select.select([sock_client1], [], [], None) 
ready_client2 = select.select([sock_client2], [], [], None) 

嘗試使用單select

ready_read, ready_write, exceptional = select.select(
    [sock_client1, sock_client2], [], [], None) 


for ready in ready_read: 
    pkt_recv_raw, addr = ready.recvfrom(4096) 
... 
+0

真棒,謝謝:) – user00