我从这样的 UDP 多播套接字接收数据报:
int res=recvfrom(socketId,buf,sizeof(char) * RECEIVE_BUFFER_SIZE,0, (SOCKADDR *)& Sender, &SenderAddrSize);
根据 MSDN,此调用会阻塞,直到数据报可用:
如果套接字上没有可用的传入数据,则 recvfrom 函数将根据为 WSARecv 定义的阻塞规则阻塞并等待数据到达,除非套接字是非阻塞的,否则不会设置 MSG_PARTIAL 标志。
现在在同一个线程中,我也想从另一个套接字接收数据包。所以现在我想在一个线程中监听两个套接字,并且应该尽快处理来自它们的数据。因此我不能再使用阻塞recvfrom
,我应该使用类似的东西(伪代码):
while (true) {
non blocking recvfrom call to Socket1
if new datagram available in Socket1 then process
non blocking recvfrom call to Socket2
if new datagram available in Socket2 then process
}
我会说我“旋转”套接字。我知道“旋转”会花费大量 CPU,但这没关系,因为我的主要要求是延迟。
我不想在两个不同的线程中处理两个套接字,因为来自这些套接字的数据是相同的,并且“合并”来自两个线程的数据有点复杂 - 从两个套接字“仲裁”数据会容易得多一根线。我必须监听两个套接字,因为 UDP 不可靠,我需要在统计上降低丢包的概率。
我有以下问题:
- 考虑到我同意花费 CPU 以获得更好的延迟,“旋转套接字”是个好主意吗?
- 我可以赢得“旋转”套接字而不是调用常规阻塞接收多少微秒?(我会赢得一些东西还是只是在浪费 CPU 功率?)