setsockopt设置SO_RCVTIMEO后超时处理及代码恢复问题咨询
套接字超时与控制权流转的实现问题
参考的信号处理逻辑
软件收到SIGINT这类信号时,若提前通过signal(SIGINT, SIGINT_HANDLER)注册过处理函数(已知signal存在缺陷,仅作示例),会按以下流程响应:
- 例程f收到SIGINT信号
- 例程f暂停执行
- 控制权转交至作为SIGINT_HANDLER的例程g,执行相关操作
- 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的错误
现有疑问
- 若客户端断开连接,程序卡在
fgets(或scanf)时触发超时,此时进程会有什么表现? - 老师课件里提到的“进程收回控制权”具体指什么?
期望实现的流程
我希望实现以下完整流程:
- 检测到套接字超时事件
- 将控制权转交至处理超时的例程g
- 在g中新建终端窗口,显示提示文本"press any key to keep connection alive"(终端窗口的创建与销毁将另行处理)
- 若用户在1分钟内按下任意键,向服务器发送"KEEP_ALIVE"消息
- 收到服务器返回的"KEEP_ALIVE_OK"后,关闭新建的终端窗口
- 将控制权返回至原例程,从超时前的
fgets位置恢复执行
核心问题
请问在C语言中能否实现上述需求?教授要求架构健壮,但我不知道从哪些方向查找相关资料。
内容的提问来源于stack exchange,提问作者ZODIACK
相关产品推荐
相关产品推荐

