1

我有类似的代码(非常简化):

char *data, *ack;
...
while (<not done>) {
    sendData(data+offset);
    receiveACK(ack);
// <<<What I want to do>>>
//  if (ack == <bad> || <receiveACK() TIMEOUT>)
//      continue;
//
    ... 
    offset += SPACING;
}

问题是 sendData() 和 receiveACK() 阻塞了我必须使用的黑匣子。

如果我在给定的时间范围内未能收到 ACK,我想要的只是再次使用相同的输入触发 sendData()。我该怎么做?

注意:线程不是一个选项。

编辑:关于 sendData() 和 receiveACK() 的一些背景知识。他们进行网络通信。sendData() 尝试发送数据,如果它不起作用则失败(这里没问题)。问题是在另一端,只有在序列和校验和正确时才会发送 ACK。换句话说:数据错误 => 没有 ACK。现在,receiveACK() 只是等待流量并对其进行解释。如果没有流量(没有 ACK),它只会继续等待,如有必要,永远等待......这就是为什么我试图围绕它建立超时。

4

2 回答 2

3

假设sendData()总是返回,尝试添加

alarm(<number of seconds>); 

就在调用之前

receiveACK(ack);

如果幸运的话,SIGALRM之后发出的信号<number of seconds>receiveACK();返回。

(这假设SIGALRM没有被阻止/忽略。)

于 2013-04-14T17:42:04.967 回答
2

如果这些函数不是黑匣子,请在您检查 receiveAck 的任何套接字上使用 select 或 poll 来设置您想要的超时。如果您及时收到确认,请移至下一个数据包。如果超时,请重新发送。

如果它们是真正的黑匣子,那你就完蛋了。您需要库中的更多功能。尽管如果您在 linux 机器上,也许您可​​以做一些事情来强制读取 EINTR 失败。虽然选择民意调查是正确的解决方案。

于 2013-04-14T17:32:29.163 回答