我的代码与此类似(非常简化):
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。换句话说:数据错误=&gt;没有确认。现在,receiveACK()只是等待流量并解释它。如果没有流量(没有ACK),它就会一直等待,如果有必要的话......这就是我试图围绕它建立超时的原因。
答案 0 :(得分:3)
假设sendData()
始终返回,请尝试添加
alarm(<number of seconds>);
在致电
之前receiveACK(ack);
如果您很幸运,SIGALRM
之后提出的<number of seconds>
信号将会receiveACK();
返回。
(这假定SIGALRM
未被阻止/忽略。)
答案 1 :(得分:2)
如果这些函数不是黑盒子,请在您在receiveAck中检查的任何套接字上使用select或poll,以设置所需的超时。如果及时得到确认,请转到下一个数据包。如果超时,请重新发送。
如果它们是真正的黑盒子,那你就搞砸了。您需要库中的更多功能。虽然如果你在Linux机器上,也许你可以用EINTR来强制读取失败。选择民意调查是正确的解决方案。