gpt4 book ai didi

Python UDP套接字丢失数据包

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:49 26 4
gpt4 key购买 nike

我正在使用用于 FTP 的 UDP 来实现客户端-服务器通信。首先,你不需要告诉我 UDP 不可靠,我知道。我的方法是:客户端请求一个文件,服务器用带有序列号的 udp 数据包向客户端发送爆炸,然后说“你错过了什么?”,然后重新发送这些数据包。在本地网络上,丢包率 < 1%。我对套接字编程还很陌生,所以我不熟悉所有套接字选项(其中在 google 上找到的大多数示例都是针对 tcp 的)。

我的问题是为什么我的客户会收到这些数据。

PACKET_SIZE = 9216
mysocket.sendto('GO!', server_addr)
while True:
resp = mysocket.recv(PACKET_SIZE)
worker_thread.enqeue_packet(resp)

但是当它恢复到 .recv() 时,它丢失了一些 udp 数据包(我已确认这些数据包是使用wireshark 发送的)。我可以通过让服务器发送速度稍微慢一些来解决这个问题(实际上,包括日志语句足以使所有功能正常运行)。

如何确保 socket.recv 在处理数据包时不会丢失任何内容?我尝试将数据推送到一个单独的线程,将其推送到队列中,但这仍然不够。

有什么想法吗?选择、recv_into、setblocking?

最佳答案

虽然您已经知道 UDP 不可靠,但您可能错过了 TCP 的其他优点。与您相关的是,TCP 具有流量控制功能,如果接收方无法应对发送方的速度(例如数据包丢失),它会自动缩小流量。因此,对于正常连接,应优先使用 TCP 进行数据传输。对于高延迟连接(卫星链路),它在默认配置下表现太差,因此有些人在那里设计自定义传输协议(protocol)(主要使用 UDP),而其他人只是调整现有的 TCP 堆栈。

我不知道你为什么使用UDP,但如果你想继续使用它,你应该向发送方添加某种反向 channel 来通知它当前的数据包丢失情况,以便它可以缩小规模。也许您应该看看 RTCP,它与 RTP 一起使用(用于 VoIP 等)。

关于Python UDP套接字丢失数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23396851/

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