我目前正在使用选择循环来管理代理中的套接字。该代理的要求之一是,如果代理向外部服务器发送消息并且在一定时间内没有得到响应,则代理应该关闭该套接字并尝试连接到辅助服务器。关闭发生在单独的线程中,而选择线程则阻塞等待活动。
我无法弄清楚如何专门检测此套接字是否已关闭,以便我可以处理故障。如果我在另一个线程中调用 close(),我会得到一个 EBADF,但我无法判断哪个套接字已关闭。我尝试通过异常 fdset 检测套接字,认为它会包含关闭的套接字,但我没有在那里返回任何内容。我还听说调用 shutdown() 会向服务器发送 FIN 并接收返回的 FIN,以便我可以关闭它;但重点是我试图关闭它,因为在超时时间内没有得到响应,所以我也不能这样做。
如果我的假设是错误的,请告诉我。任何想法,将不胜感激。
编辑:
响应有关使用选择超时的建议:我需要异步关闭,因为连接到代理的客户端将超时,我不能等待轮询选择。只有当我将选择超时设置得非常小时,这才有效,然后会不断轮询并浪费我不想要的资源。
一般来说,我只是将套接字标记为在另一个线程中关闭,然后当 select() 从活动返回或超时时,我运行清理过程并关闭所有死连接并更新 fd_set。以任何其他方式执行此操作都会导致您放弃连接的竞争条件,就像 select() 最终识别出它的一些数据一样,然后您将其关闭,但另一个线程尝试处理检测到的数据并获取沮丧地发现连接已关闭。
哦,poll() 通常比 select() 更好,因为无需复制太多数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)