【问题标题】:Python: fixed wait time for receiving socket dataPython:固定等待接收套接字数据的时间
【发布时间】:2016-06-06 06:20:40
【问题描述】:

我写了一个 udp 服务器和客户端。客户端向服务器发送简单的 udp 消息,服务器将响应。服务器会随机丢弃一些响应数据包。在我的客户端代码中,我写了以下行

for i in range(0,10):
  sequence_number = i
  start = time.time()
  clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
  # Receive the client packet along with the address it is coming from
  message, address = clientSocket.recvfrom(1024)
  end = time.time()
  if message != '':
    print message
    rtt = end - start
    print "RTT = " + str(rtt)

如果服务器放弃响应,以下行会卡在那里。

message, address = clientSocket.recvfrom(1024)

我在这里尝试了超时方法: Socket recv - limited wait time
但是超时将中止整个客户端程序。我只希望客户端等待 5 秒,然后如果没有收到最后一个响应(被服务器丢弃),则继续发送下一个数据包。 如何在客户端设置等待时间?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    settimeout() 的链接是正确的。超时时会引发异常。

    设置阻塞套接字操作的超时时间。 value 参数可以是 表示秒数的非负浮点数,或无。如果一个 给定非零值,随后的套接字操作将引发 如果超时时间值在 操作已完成。如果给定零,则放入套接字 非阻塞模式。如果给出 None ,则将套接字置于阻塞状态 模式。

    您需要将代码放在try 块中,以便异常不会中止您的程序。

    import socket.timeout as TimeoutException
    # set timeout 5 second
    clientsocket.settimeout(5)
    for i in range(0,10):
      sequence_number = i
      start = time.time()
      clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
      # Receive the client packet along with the address it is coming from
      try:
        message, address = clientSocket.recvfrom(1024)
      except TimeoutException:
        print("Timeout!!! Try again...")
        continue
      end = time.time()
      if message != '':
        print message
        rtt = end - start
        print "RTT = " + str(rtt)
    

    【讨论】:

      【解决方案2】:

      就用这个

      readable, empty, empt = select.select(servers, [], [] , 10 ) # wait just 10sec 
      ready_server = readable[0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 2017-01-17
        相关资源
        最近更新 更多