如果在C中响应时间太长,如何取消函数调用?

时间:2017-10-27 19:54:04

标签: c server ftp client

是否有办法调用某个功能,如果响应时间过长,是否可以取消或跳过该功能?

我正在模拟ftp连接,并且我正在使用此函数调用从服务器接收响应:

status = receiveMessage(ccSocket, replyMsg, sizeof(replyMsg), &msgSize);

有没有办法等待,比方说,5秒,如果还没有响应,可以跳过函数调用吗?

3 个答案:

答案 0 :(得分:5)

您可以使用许多不同的方法来解决此问题。

  1. 使用"选择"调用,允许你的系统检查是否有可用数据,使用给定的超时允许你取消检查是否需要很长时间。
  2. 异步设计使您能够观看"套接字,无需等待"在该套接字上,意味着只有在知道数据可用时才会运行您的进程 3
  3. 非阻塞设计允许您出于多种不同的原因使用您的处理器,其中套接字上的通信不应该保持您的处理器,类似于Async通信的方式,但是有一点点扭曲

答案 1 :(得分:1)

取决于功能以及对它的控制程度。

如果recv来电,您可以使用setsocketoptSO_RCVTIMEO来设置超时。在这种情况下,函数调用将返回EAGAINEWOULDBLOCK

或者,您可以中断recv来电 - How to cleanly interrupt a thread blocking on a recv call?

中描述了执行此操作的方式

在更多通用案例中,您可以启动并行线程,并让它们都保持对布尔值的引用,该值将标记超时是否已过期。执行该工作的原始线程需要定期检查它,另一个将在超时过后标记它。如果函数调用在超时之前完成,那么关闭帮助程序将是主线程的责任。

在伪代码中它看起来像这样:

shared mutable state:

job_to_do = true
timeout_happened = false

main thread:

pthread_create(helper, ...)
/* we depend on the fact that 'job_to_do' will be set to false when there's nothing more to process */
while (job_to_do && !timeout_happened) {
    process_more_for_some_time /* this obviously has to take less time than timeout */
}
if (job_to_do) {
    perror("timeout")
}

helper thread:

time_passed = 0
while (job_to_do && time_passed < timeout) {
    sleep(sample)
    time_passed += sample
}
/* there's no point in signalling timeout if the job has finished */
if (job_to_do)
    timeout_happened = true

实施细节:job_to_dotimeout_happened必须是原子/可见的,因为您可能是从不同的核心访问变量。

答案 2 :(得分:1)

  1. 您可以检查系统中是否有看门狗并使用它

  2. 设置每3秒调用一次定时器中断并在其处理程序中设置全局变量STOP=true

  3. 你的大代码中的
  4. 放了if (STOP) exit(1)