超时阻塞函数调用,没有线程,没有外部库

时间:2013-04-14 17:24:11

标签: c network-programming

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

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),它就会一直等待,如果有必要的话......这就是我试图围绕它建立超时的原因。

2 个答案:

答案 0 :(得分:3)

假设sendData()始终返回,请尝试添加

alarm(<number of seconds>); 

在致电

之前
receiveACK(ack);

如果您很幸运,SIGALRM之后提出的<number of seconds>信号将会receiveACK();返回。

(这假定SIGALRM未被阻止/忽略。)

答案 1 :(得分:2)

如果这些函数不是黑盒子,请在您在receiveAck中检查的任何套接字上使用select或poll,以设置所需的超时。如果及时得到确认,请转到下一个数据包。如果超时,请重新发送。

如果它们是真正的黑盒子,那你就搞砸了。您需要库中的更多功能。虽然如果你在Linux机器上,也许你可以用EINTR来强制读取失败。选择民意调查是正确的解决方案。