UDP客户端每秒发送一次ping,并打印发送给它的任何内容?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (81)

这是目前我的代码:

import socket
from time import sleep
from contextlib import contextmanager

UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 14004
Message = b"Hello World, From Client B"


@contextmanager
def socket_ctx():
    """ Context Manager for the socket. Makes sure the socket will close regardless of why it exited."""
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # Assign IP address and a RANDOM available port number to socket
    my_socket.bind(('127.0.0.1', 0))
    try:
        # Let the rest of the app use the socket and wait for it to finish
        yield my_socket
    finally:
        my_socket.close()


def send_data(client_sock):
    client_sock.sendto(Message, (UDP_IP_ADDRESS, UDP_PORT_NO))


def listen(client_sock):
    print(client_sock.recvfrom(100))



with socket_ctx() as sock:
    while True:
        send_data(sock)
        listen(sock)
        sleep(2)

目前,它发送一次ping,然后只是闲置,因为它可能正在监听。如果确实发生了ping回,比如说,另一个客户端向服务器发送一个ping命令,并且服务器向该客户端发送ping命令,它会听到并打印它,然后再次启动该循环。

提问于
用户回答回答于

代码:

import socket
import select
import time

UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 14004
Message = b"Hello World, From Client B"

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(('127.0.0.1', 0))
print "UDP socket is listening for incoming packets on port", udp_socket.getsockname()[1]

# When we want to send the next periodic-ping-message out
nextPingTime = time.time()

while True:
   secondsUntilNextPing = nextPingTime - time.time();
   if (secondsUntilNextPing < 0):
      secondsUntilNextPing = 0

   # select() won't return until udp_socket has some data
   # ready-for-read, OR until secondsUntilNextPing seconds 
   # have passed, whichever comes first
   inReady, outReady, exReady = select.select([udp_socket], [], [], secondsUntilNextPing)

   if (udp_socket in inReady):
      # There's an incoming UDP packet ready to receive!
      print(udp_socket.recvfrom(100))

   now = time.time()
   if (now >= nextPingTime):
      # Time to send out the next ping!
      print "Sending out scheduled ping at time ", now
      udp_socket.sendto(Message, (UDP_IP_ADDRESS, UDP_PORT_NO))
      nextPingTime = now + 1.0   # we'll do it again in another second

热门问答

数据万象持久化在JavaScript SDK中的问题?

可以的,有Domain参数。请参考:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/csp/csp.html#L56

有谁用unity 3d 实现过对象的上传储存和者下载?

我不是米

腾讯 · 工程师 (已认证)

对象存储工程师
推荐

请正确填写bucket参数,bucket参数里面不要带上-appid

cos.sliceUploadFile支持断点续传吗?

如果用的是 cos-js-sdk,那么 cos.restartTask 是会断点续传的,用法没有问题。 PS: sdk 使用可以参考 demo.js https://github.com/tencentyun/cos-js-sdk-v5/blob/master/demo/demo...... 展开详请

使用独立H5接入人脸核身,在微信浏览器拍摄视频按钮无法点击?

旺仔小小鹿

社区 · 运营 (已认证)

Less is more
推荐

使用iframe会有问题 ,微信有限制,不允许使用iframe调用jsapi摄像头 ,微信里,不能用iframe

ios应该都不行的,安卓需要看是什么浏览器。

云服务器中ping不可达,请教一下如何恢复?

推荐已采纳
本地主机 ping 不通实例可能由以下问题导致: 目标服务器的设置不正确 域名没有正确解析 链路故障 在确保本地网络正常的前提下(即您可以正常 ping 通其他网站),可根据以下操作进行排查: 检查实例是否配置公网 IP 检查安全组设置 检查系统设置 检查域名是否备案 检查域名解...... 展开详请

为什么加固之后生成四个文件?

腾讯云@移动安全

腾讯 · 移动开发工程师 (已认证)

腾讯云移动安全前端开发
推荐

选择最后一个_legu_aligned_signed.apk 文件,这个是加固并已重签名的文件。

所属标签

扫码关注云+社区

领取腾讯云代金券