【问题标题】:Wait X seconds to recieve a UDP packet Python等待 X 秒以接收 UDP 数据包 Python
【发布时间】:2014-04-02 10:17:23
【问题描述】:

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

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

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

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

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

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

有人可以帮帮我吗?

谢谢!

【问题讨论】:

    标签: python sockets select delay recvfrom


    【解决方案1】:

    scapy 是一件容易的事:

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

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

    【讨论】:

    • 哦,伙计们!它需要root,我必须在没有root权限的情况下这样做!!
    【解决方案2】:

    如果您将套接字设置为非阻塞,您可以轻松实现此目的。声明套接字后:

    skt1.setblocking(0)
    

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

    try:
        skt1.recvfrom(64)
    except socket.error:
        pass
    

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 2010-12-09
      • 2016-05-25
      • 2015-09-14
      • 2012-11-09
      • 1970-01-01
      • 2014-12-13
      • 2017-06-13
      • 2015-02-17
      相关资源
      最近更新 更多