2016-07-05 7 views
1

Ich bin neu in Python. Und ich kann den Server nicht dazu bringen, zwei Ports gleichzeitig zu hören. Dies ist der Code ich bis jetzt geschrieben haben:Python - Server hört von zwei UDP-Sockets

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 

Wenn ich diesen Code ausführen zusammen mit einem Client, kann der Server noch nichts erhalten. Es funktioniert nur, wenn ich nur einen der ready_clients verwende.

Vielen Dank im Voraus!

+0

warum sollte der gleiche Code hören sowohl auf dem Client-Socket und der Server-Socket? – e4c5

+0

@ e4c5 Sorry, ich bin mir nicht sicher, ob ich deine Frage verstanden habe. Vielleicht hilft das: Dieser Code ist eigentlich ein Modul, das transparent für die Übertragung zwischen zwei Knoten arbeiten soll. Er empfängt ihre Pakete und sendet sie erneut an den realen Zielknoten. Ich muss wissen von wem ich empfangen habe, dann kann ich wissen, an wen ich die Daten senden soll. Da ich es lokal simuliere, ist die Portnummer die Art, die ich verwende, um die Quellen zu unterscheiden. – user00

+0

In diesem Fall klingt es wie Sie versuchen, iptables oder ähnliches neu zu erfinden. – e4c5

Antwort

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

Versuchen ein einzelner select mit:

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

genial, danke :) – user00