2015-11-12 83 views
1

这是问题是真正关注我的问题,而不是相对于我可以找到关于此主题的任何其他问题。丢弃数据报套接字的传入'数据包

PSA:当我说“包”我的意思是在一个单一的socket.recv(MAXSIZE)接收到一个完整的字符串

我开发了类似的代码Java的(我PREF语言)和它相同的结果是好的,现在我必须做python。

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

正常的套接字工作正常,因为我期望,而数据报没有。

我连续从服务器(不是我的,不是开源)接收数据包的速度超过每秒5次,但我想每3秒只处理其中的一个。在java中,我只是做了一个“睡眠”,并没有问题,我只得到最后一个活动数据包,而在Python中使用“time.sleep(3)”数据包排队(我不知道如何以及在哪里)并没有下降。

我必须放弃它们,因为这些都不需要,我必须在一个和另一个之间进行HTTP调用,所以我无法为以该速率接收的每组数据启动HTTP POST!

这里是我的“代码”为监听套接字,一些意见是对私有代码:

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") 

回答

1

当你有一个开放的插座,所有正确处理数据包应该交付给应用程序。我们希望尽可能使我们的网络连接更加可靠,是吗?丢弃数据包是最后一招。

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

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

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