“spin”recvfrom socket - 如果要求延迟,那么这个好主意?

时间:2013-04-27 16:47:47

标签: c++ sockets

我从UDP Mulitcast套接字接收数据报:

int res=recvfrom(socketId,buf,sizeof(char) * RECEIVE_BUFFER_SIZE,0, (SOCKADDR *)& Sender, &SenderAddrSize);

根据MSDN,此调用将阻塞,直到数据报可用:


如果套接字上没有可用的传入数据,则recvfrom函数会阻塞并等待数据到达,这是根据为WSARecv定义的阻塞规则而未设置MSG_PARTIAL标志,除非套接字是非阻塞的。


现在在同一个线程中我也希望从另一个套接字接收数据包。所以现在我想在一个线程中听两个套接字,并且应该尽快处理来自它们的数据。因为我不能再使用阻塞recvfrom,我应该使用类似的东西(pseude-code):

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功耗?)

0 个答案:

没有答案