gpt4 book ai didi

python - 丢弃数据报套接字的传入 'packets'

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:57 28 4
gpt4 key购买 nike

这个问题确实集中在我的问题上,与我在该主题上找到的任何其他问题无关。

PSA:当我说“数据包”时,我的意思是在单个 socket.recv(maxsize)

中接收到的完整字符串

我在 Java(我的首选语言)上开发了类似的代码以获得相同的结果,没关系,现在我必须在 python 中做。

我有两个并行运行的进程:1-连接到特定IP的普通客户端套接字2-绑定(bind)到“所有”IP 的“客户端”数据报套接字。

正常套接字按我的预期正常工作,而数据报则不然。

我持续以每秒超过 5 个的速度从服务器(不是我的也不是开源的)接收数据包,但我只想每 3 秒处理其中一个。在java中,我只做了一个“ sleep ”,没关系,我只得到最后一个实时数据包,而在Python中,使用“time.sleep(3)”数据包排队(我不知道如何以及在哪里)并且没有被丢弃。

我必须删除它们,因为这些是不需要的,而且我必须在一个和另一个之间进行 HTTP 调用,这样我就无法为以该速率接收到的每组数据触发 HTTP post!

这是我的监听套接字的“代码”,一些注释是针对私有(private)代码的:

def listenPositions():
lsSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
lsSocket.bind(("0.0.0.0", 8787))
lsSocket.setblocking(0)
try:
while True:
ready = select.select([lsSocket], [], [], 1)
if ready[0]:
lsSocket.settimeout(1)
recvData = lsSocket.recv(16384)
if len(recvData) != 0:
recv = recvData[0:len(recvData)].decode("utf-8")
#print("LS: Received: " + recv)
strings = filter(None, str(recv).split('\n'))
print("Strings count=" + str(len(strings))+ ": " + str(strings))
for item in strings:
#parse the received strings as json and get the items
jsonPosition = json.loads(item)
strId = jsonPosition["id"]
coordinates = jsonPosition.get("coordinates")
if coordinates is None:
continue
print("coordinates not null:" + str(coordinates))
#DO THE HTTP POST REQUEST


time.sleep(3) #Pause the system for X seconds, but other packets are queued!
else:
print("LS: Received empty")
else:
print("LS: No data, timeout")
except Exception as e:
print(e)
#handle exceptions...
print("Exception, close everything")

最佳答案

当您有一个打开的套接字时,所有正确寻址的数据包都应传递到应用程序。我们希望我们的网络连接尽可能可靠,不是吗?丢弃数据包是最后的手段。

如果您只想偶尔获取数据包,您可以创建一个监听套接字,获取数据包并关闭套接字。

然而,没有什么比忽略数据包更容易的了。只需跳过其处理并继续。下面的代码不完整,但希望表达了我的意思。

TIMEOUT = 1.0
INT = 3.0 # interval in seconds

# create udp_socket
last = time.time() - INT
udp_socket.settimeout(TIMEOUT)
while True:
try:
packet = udp_socket.recv(MAXSIZE)
except socket.timeout:
# handle recv timeout
continue # or break, or return
except OSError:
# handle recv error (Python 3.3+)
break # or continue, or return
now = time.time()
if now - last >= INT:
# process the packet
last = now

请注意,如果您仅从一个来源读取内容,则不需要 select

关于python - 丢弃数据报套接字的传入 'packets',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33669991/

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