2016-07-05 11 views
1

新しいPythonで新しい。そして、私はサーバーが同時に2つのポートを聞くことができません。 これは私が今まで書かれているコードです:私はクライアントと一緒にこのコードを実行するとPython - 2つの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のうちの1つだけを使用する場合にのみ機能します。

ありがとうございます!

+0

同じコードは、クライアントソケットとサーバソケットの両方に耳を傾けなければならない理由は? – e4c5

+0

@ e4c5申し訳ありませんが、私はあなたの質問を理解しているか分からない。多分このコードは役に立ちます:このコードは、実際には2つのノード間で透過的に動作するモジュールです。パケットを受信し、それらを実際の宛先ノードに再送信する。私は誰が私がデータを送信すべきかを知ることができるので、私が受け取った人から知る必要があります。私はローカルでそれをシミュレートするので、ポート番号はソースを区別するために使用している方法です。 – 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

関連する問題