2016-07-05 89 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