0

我正在用 Python 做一个客户端,他注册到服务器中。该客户端向服务器发送一个 UDP 数据包register并等待register accepted来自服务器的响应数据包。

有一些数据包丢失的可能性,因为它是 UDP,所以我需要代码:

发送数据包并等待5秒响应,如果没有收到数据包,则再次发送数据包然后等待10秒,如果已经没有响应,现在等待15秒,如果再次没有响应,则中断循环。

我的问题是要接收我正在做的数据包:

skt1.sendto(pqtUdp,(srvAdr,prtUdp))
data,addrs = skt1.recvfrom(56)

rcvfrom 是一种阻塞方法。我进行了搜索,我认为使用select我可以知道何时收到数据包然后读取套接字并获取它,但我不知道该怎么做,我找不到select简单的例子来说明我在做什么。

有人可以给我一些帮助吗?

谢谢!

4

2 回答 2

1

这是scapy的一项简单任务:

>>> sr(IP(dst="172.20.29.5/30")/UDP(dport=[21,22,23]),inter=5,retry=2,timeout=1)

sr 是 sendreceice 函数,您可以使用 inter 指定等待间隔以及重试次数和超时。

于 2014-04-02T11:12:30.797 回答
0

如果将套接字设置为非阻塞,则可以轻松实现此目的。声明套接字后,请执行以下操作:

skt1.setblocking(0)

通过这样做,如果 recvfrom() 没有收到数据包,它将引发一个错误,您可以处理并从中继续,如下所示:

try:
    skt1.recvfrom(64)
except socket.error:
    pass
于 2016-04-24T03:24:05.750 回答