gpt4 book ai didi

python - 从Python脚本中的多个UDP套接字监听

转载 作者:行者123 更新时间:2023-12-03 12:08:58 28 4
gpt4 key购买 nike

我目前正在尝试让Python脚本使用两个不同的UDP套接字(一个套接字,一个端口)从两个不同的端口接收数据,其初始化如下:

# socket 1 
source1_UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
source1_UDPSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
source1_port = 6008
source1_listen_addr = ("",source1_port)
source1_UDPSock.bind(source1_listen_addr)

# socket 2
source2_DPSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
source2_UDPSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
source2_port = 6009
source2_listen_addr = ("", source2_port)
source2_UDPSock.bind(source2_listen_addr)

当我需要使用以下几行来检索接收到的数据时,就会出现问题:
soc1_data, addr = source1_UDPSock.recvfrom(source1_port)
soc2_data, addr = source2_UDPSock.recvfrom(source2_port)

该代码正常运行,但是如果我从第一个recvfrom中没有得到任何数据,它将阻塞执行,直到得到一些东西为止。我尝试在它们两个中都使用 source1_UDPSock.setblocking(False)将这两个套接字都设置为非阻塞,但是由于我不得不等待一到两秒钟来防止BlockingIOError:[WinError 10035],因此这显示出了一个不好的解决方案出现,丢失可能从其他端口接收的数据。

将两个端口都设置为非阻塞后,我尝试在以下代码中使用select:
ready_read, ready_write, exceptional = select.select([source1_UDPSock, source2_UDPSock], [],[], None)
for ready in ready_read:
data_1, addr = source1_UDPSock.recvfrom(source1_port)
data_2, addr = source2_UDPSock.recvfrom(source2_port)

但我没有成功,因为它不断抛出BlockingIOError 10035。

使用多线程(一个线程,一个开放套接字)可以解决此问题吗?

先感谢您。

问题已解决!

最后,我应用了此 question中找到的解决方案,并进行了一些修改。我将端口监听器分为两个文件,并创建了此脚本:
import multiprocessing 
import subprocess

def worker(file):
subprocess.Popen(['python', file])

if __name__ == "__main__":
files = ['listener1.py', 'listener2.py']
for i in files:
p = multiprocessing.Process(target = worker(i))
p.start()

每个监听器都需要对接收到的数据执行一些特定的处理(在两种情况下是不同的),因此将它们分开是可以的。

再次感谢大家!

最佳答案

您可以使用select-Module立即在多个非阻塞套接字上等待数据。

另一种可能性是每个套接字使用单独的线程,并继续使用阻塞套接字,但是随后您将不得不同步线程。

这取决于代码的一般结构,哪种方法更容易或更完善。

编辑:

当您从当前没有数据的非阻塞套接字接收到消息时,抛出BlockingIOError 10035,这意味着“如果该操作不是非阻塞套接字,则该操作将被阻塞”。

在更改的代码中,您可能不应读取for循环中的所有套接字,而应仅读取准备就绪返回的那些套接字。您可能想阅读阻塞/非阻塞套接字的基础知识,例如Beej's Guide

关于python - 从Python脚本中的多个UDP套接字监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46272718/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com