Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免在udp套接字中积累数据或从udp套接字读取最新数据 我试图把数据从C++代码连续发送到Python代码。我使用udp套接字发送数据。发送速率比接收速率快,因为它是一个简单的传感器代码。因此,发送的数据在套接字中累积。当我尝试读取数据时,它返回一个旧数据。发送新数据时,如何从套接字读取最新数据或删除旧数据_Python_Sockets_Udp_Recvfrom - Fatal编程技术网

避免在udp套接字中积累数据或从udp套接字读取最新数据 我试图把数据从C++代码连续发送到Python代码。我使用udp套接字发送数据。发送速率比接收速率快,因为它是一个简单的传感器代码。因此,发送的数据在套接字中累积。当我尝试读取数据时,它返回一个旧数据。发送新数据时,如何从套接字读取最新数据或删除旧数据

避免在udp套接字中积累数据或从udp套接字读取最新数据 我试图把数据从C++代码连续发送到Python代码。我使用udp套接字发送数据。发送速率比接收速率快,因为它是一个简单的传感器代码。因此,发送的数据在套接字中累积。当我尝试读取数据时,它返回一个旧数据。发送新数据时,如何从套接字读取最新数据或删除旧数据,python,sockets,udp,recvfrom,Python,Sockets,Udp,Recvfrom,如何从套接字读取最新数据或删除旧数据 何时发送新数据 从套接字读取数据包并将其放入缓冲区。保持从套接字读取数据包,每次都将每个数据包放入缓冲区(替换之前缓冲区中的任何数据包),直到没有更多的数据可读取——非阻塞I/O模式对此很有用,因为非阻塞recv()当套接字的传入数据缓冲区中的数据用完时,将抛出socket.error异常,代码为eWoldBlock。读取完所有数据后,缓冲区中剩下的都是最新的数据,所以继续使用这些数据 草图/示例代码如下(未测试,可能包含错误): 只需继续阅读MSG_NOW

如何从套接字读取最新数据或删除旧数据 何时发送新数据

从套接字读取数据包并将其放入缓冲区。保持从套接字读取数据包,每次都将每个数据包放入缓冲区(替换之前缓冲区中的任何数据包),直到没有更多的数据可读取——非阻塞I/O模式对此很有用,因为非阻塞
recv()当套接字的传入数据缓冲区中的数据用完时,
将抛出socket.error异常,代码为
eWoldBlock
。读取完所有数据后,缓冲区中剩下的都是最新的数据,所以继续使用这些数据

草图/示例代码如下(未测试,可能包含错误):


只需继续阅读MSG_NOWAIT,直到返回-1,返回值为
errno=EAGAIN/ewoodblock
。您成功读入缓冲区的最后一个数据报仍然存在,并且它将是套接字接收缓冲区中的最后一个内容。但是你需要记住上次成功阅读返回的长度。@Marqueisoflorne谢谢你的回答。成功了谢谢,成功了!错误消息略有不同,但经过一些更改后,它工作正常。非常感谢你花时间帮助一个随意的人。再次,非常感谢:)
  sock = socket.socket(family, socket.SOCK_DGRAM)

  [... bind socket, etc... ]

  # Receive-UDP-data event-loop begins here
  sock.setblocking(False)
  while True:
     newestData = None

     keepReceiving = True
     while keepReceiving:
        try:
           data, fromAddr = sock.recvfrom(2048)
           if data:
              newestData = data
        except socket.error as why:
           if why.args[0] == EWOULDBLOCK:
              keepReceiving = False
           else:
              raise why

     if (newestData):
        # code to handle/parse (newestData) here