丢弃数据报套接字的传入 'packets'

Drop Incoming 'packets' for Datagram Socket

这个问题真正关注的是我的问题,与我能找到的关于这个主题的任何其他问题无关。

PSA:当我说 "packet" 时,我的意思是在单个 socket.recv(maxsize)

中收到完整的字符串

我在 Java(我的首选语言)上为相同的结果开发了类似的代码,没关系,现在我必须在 python.

上做

我有两个 运行 并行的进程: 1-连接到特定 IP 的普通客户端套接字 2-A "client" 绑定到 "ALL" IP 的数据报套接字。

普通套接字如我所料正常工作,而数据报则不然。

我不断以每秒 5 个以上的速度从服务器(不是我的服务器,也不是开源服务器)接收数据包,但我想每 3 秒只处理其中一个。在 java 我只做了一个 "sleep" 没关系,我只得到了最后一个活动数据包,而在 Python 和 "time.sleep(3)" 数据包排队(我不'知道如何以及在哪里)而不是掉线。

我必须放弃它们,因为不需要它们,而且我必须在一个和另一个之间进行 HTTP 调用,所以我无法为以该速率接收的每组数据触发 HTTP post !

这里是我的"code"监听套接字,一些评论是私人代码:

def listenPositions():
    lsSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    lsSocket.bind(("0.0.0.0", 8787))
    lsSocket.setblocking(0)
    try:
        while True:
            ready = select.select([lsSocket], [], [], 1)
            if ready[0]:
                lsSocket.settimeout(1)
                recvData = lsSocket.recv(16384)
                if len(recvData) != 0:
                    recv = recvData[0:len(recvData)].decode("utf-8")
                    #print("LS: Received: " + recv)
                    strings = filter(None, str(recv).split('\n'))
                    print("Strings count=" + str(len(strings))+ ": " + str(strings))
                    for item in strings:
                       #parse the received strings as json and get the items
                        jsonPosition = json.loads(item)
                        strId = jsonPosition["id"]
                        coordinates = jsonPosition.get("coordinates")
                        if coordinates is None:
                            continue
                        print("coordinates not null:" + str(coordinates))
#DO THE HTTP POST REQUEST


                    time.sleep(3) #Pause the system for X seconds, but other packets are queued!
                else:
                    print("LS: Received empty")
            else:
                print("LS: No data, timeout")
    except Exception as e:
        print(e)
        #handle exceptions...
        print("Exception, close everything")

当您有一个打开的套接字时,所有正确寻址的数据包都应该传送到应用程序。我们希望我们的网络连接尽可能可靠,不是吗?丢弃数据包是最后的手段。

如果你只想时不时地获取一个数据包,你可以创建一个监听套接字,获取一个数据包并关闭套接字。

然而,没有什么比忽略数据包更容易的了。只需跳过它的处理并继续。下面的代码不完整,但希望能表达我的意思。

TIMEOUT = 1.0
INT = 3.0        # interval in seconds

# create udp_socket
last = time.time() - INT
udp_socket.settimeout(TIMEOUT)
while True:
    try:
        packet = udp_socket.recv(MAXSIZE)
    except socket.timeout:
        # handle recv timeout
        continue    # or break, or return
    except OSError:
        # handle recv error (Python 3.3+)
        break       # or continue, or return
    now = time.time()
    if now - last >= INT:
        # process the packet
        last = now

请注意,如果您只阅读一个来源,则不需要 select