UDP socket.receive 开始收集还是可用?
does UDP socket.receive begin collecting or get available?
我有一个线程(在 android -Wifi 上)接收每 40 毫秒发送一次的 UDP 数据包流。捕获数据包后,线程将处理数据并在 40ms 内返回接收。
网络层是仅在调用 socket.receive 后才接受 UDP 数据包,还是它存储数据包(在缓冲区内)直到 socket.receive 声明它?
(我知道缓冲区有大小并且会丢弃旧的)(我也知道如果没有可用的它会等待)
换句话说,我需要使用双接收线程吗?
Does the network layer accept UDP packets only after invoking
socket.receive, or it stores packets (within a buffer) until a
socket.receive claims it?
是后者。每个 UDP 套接字都有一个 incoming-data 缓冲区,一旦你将 UDP 套接字绑定到一个端口,网络堆栈接收到的任何 UDP 数据包都会被放入这个缓冲区(假设缓冲区仍然有足够的空闲 space 在其中以便数据包适合)。无论您的应用程序是否调用 recv()
.
,接收到的数据包都将添加到缓冲区中
调用 recv()
只会导致缓冲区中最早的 UDP 数据包移出缓冲区并移入您传递给 recv()
的数组中。
我有一个线程(在 android -Wifi 上)接收每 40 毫秒发送一次的 UDP 数据包流。捕获数据包后,线程将处理数据并在 40ms 内返回接收。
网络层是仅在调用 socket.receive 后才接受 UDP 数据包,还是它存储数据包(在缓冲区内)直到 socket.receive 声明它? (我知道缓冲区有大小并且会丢弃旧的)(我也知道如果没有可用的它会等待)
换句话说,我需要使用双接收线程吗?
Does the network layer accept UDP packets only after invoking socket.receive, or it stores packets (within a buffer) until a socket.receive claims it?
是后者。每个 UDP 套接字都有一个 incoming-data 缓冲区,一旦你将 UDP 套接字绑定到一个端口,网络堆栈接收到的任何 UDP 数据包都会被放入这个缓冲区(假设缓冲区仍然有足够的空闲 space 在其中以便数据包适合)。无论您的应用程序是否调用 recv()
.
调用 recv()
只会导致缓冲区中最早的 UDP 数据包移出缓冲区并移入您传递给 recv()
的数组中。