You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

setsockopt设置SO_RCVTIMEO后超时处理及代码恢复问题咨询

套接字超时与控制权流转的实现问题

参考的信号处理逻辑

软件收到SIGINT这类信号时,若提前通过signal(SIGINT, SIGINT_HANDLER)注册过处理函数(已知signal存在缺陷,仅作示例),会按以下流程响应:

  1. 例程f收到SIGINT信号
  2. 例程f暂停执行
  3. 控制权转交至作为SIGINT_HANDLER的例程g,执行相关操作
  4. g执行完毕后,控制权返回至例程f,从暂停位置恢复执行

我需要实现类似的控制权流转逻辑,但不依赖信号机制。

我的场景与现有代码

我给客户端套接字通过setsockopt设置了4分钟的SO_RCVTIMEO超时,要求4分钟内套接字无数据时,进程能收回控制权,但存在一些疑问。

现有示例代码如下:

struct timeval tv;
tv.tv_sec = 240;  // 4分钟超时
if (setsockopt(my_socket, SOL_SOCKET, SO_RCVTIMEO, (struct timeval *)&tv, sizeof(struct timeval))) {
   perror("setsockopt: rcvtimeo");
   exit(1);
}

/* 我在Stack的某个回答里看到有人说这是设置超时的正确方式,如果有问题请指出! */

// 让用户输入消息发送到套接字,我知道用scanf不合适,只是简化示例
char buff[4096];
fgets("%s", buff);  // 注:此处fgets调用错误,正确应为fgets(buff, sizeof(buff), stdin)

write(my_socket, buff, strlen(buff)); // 实际代码中会检查write的错误

现有疑问

  1. 若客户端断开连接,程序卡在fgets(或scanf)时触发超时,此时进程会有什么表现?
  2. 老师课件里提到的“进程收回控制权”具体指什么?

期望实现的流程

我希望实现以下完整流程:

  1. 检测到套接字超时事件
  2. 将控制权转交至处理超时的例程g
  3. 在g中新建终端窗口,显示提示文本"press any key to keep connection alive"(终端窗口的创建与销毁将另行处理)
  4. 若用户在1分钟内按下任意键,向服务器发送"KEEP_ALIVE"消息
  5. 收到服务器返回的"KEEP_ALIVE_OK"后,关闭新建的终端窗口
  6. 将控制权返回至原例程,从超时前的fgets位置恢复执行

核心问题

请问在C语言中能否实现上述需求?教授要求架构健壮,但我不知道从哪些方向查找相关资料。

内容的提问来源于stack exchange,提问作者ZODIACK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:46:24