如何在套接字关闭时唤醒 select()?

2024-02-19

我目前正在使用选择循环来管理代理中的套接字。该代理的要求之一是,如果代理向外部服务器发送消息并且在一定时间内没有得到响应,则代理应该关闭该套接字并尝试连接到辅助服务器。关闭发生在单独的线程中,而选择线程则阻塞等待活动。

我无法弄清楚如何专门检测此套接字是否已关闭,以便我可以处理故障。如果我在另一个线程中调用 close(),我会得到一个 EBADF,但我无法判断哪个套接字已关闭。我尝试通过异常 fdset 检测套接字,认为它会包含关闭的套接字,但我没有在那里返回任何内容。我还听说调用 shutdown() 会向服务器发送 FIN 并接收返回的 FIN,以便我可以关闭它;但重点是我试图关闭它,因为在超时时间内没有得到响应,所以我也不能这样做。

如果我的假设是错误的,请告诉我。任何想法,将不胜感激。

编辑: 响应有关使用选择超时的建议:我需要异步关闭,因为连接到代理的客户端将超时,我不能等待轮询选择。只有当我将选择超时设置得非常小时,这才有效,然后会不断轮询并浪费我不想要的资源。


一般来说,我只是将套接字标记为在另一个线程中关闭,然后当 select() 从活动返回或超时时,我运行清理过程并关闭所有死连接并更新 fd_set。以任何其他方式执行此操作都会导致您放弃连接的竞争条件,就像 select() 最终识别出它的一些数据一样,然后您将其关闭,但另一个线程尝试处理检测到的数据并获取沮丧地发现连接已关闭。

哦,poll() 通常比 select() 更好,因为无需复制太多数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在套接字关闭时唤醒 select()? 的相关文章

  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 具有阻塞功能的 Twisted LoopingCall

    我有一个应用程序需要轮询数据库以了解可能的配置更改 该应用程序是一个使用 Twisted 的简单 xmlrpc 服务器 我尝试过使用Twisted的LoopingCall来执行轮询 但是由于LoopingCall在主线程上运行 所以对db的
  • 尝试删除文件时如何调试“共享冲突”

    我有一个多线程 C 应用程序 它创建文件 打开文件进行处理 然后在完成后删除它们 此应用程序预计会处理 1 100 个文件 当我尝试在处理后删除文件时 有点随机 很可能归因于应用程序的多线程性质 我遇到共享冲突 我的直觉告诉我 维克 你在尝
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 当我退出应用程序时,如何删除 UNIX 域套接字文件?

    我有一个服务器应用程序 它在特定路径中创建一个 UNIX 域套接字 其名称和bind 到它 仅当我有意从应用程序代码中关闭 停止应用程序时 我才需要删除套接字 否则需要打开 我该怎么做呢 Thanks Edit 考虑一下我从终端内部启动并运
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • 为什么绿色线程不能在多核上工作

    在维基百科上 绿色线程 http en wikipedia org wiki Green threads被描述为通常无法在多核上运行 而没有解释原因 在多核处理器上 本机线程实现可以 自动将工作分配给多个处理器 而绿色线程 实现通常不能 我
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • Spring mvc 验证异常处理程序在控制器方法之前调用

    我有以下代码 public class StudentController extends BaseController RequestMapping value student edit method RequestMethod POST
  • Flask-Sqlalchemy:数据库查询不返回新数据

    我正在构建一个应用程序 它从一项服务接收 webhook 将数据存储在数据库中 然后通过 API 提供数据 我能够成功地将数据添加到我的应用程序中 但是当我查询数据库时 我只收到上次启动应用程序时数据库中的第一次提交 例如 如果我启动应用程
  • Android:ListView 中的按钮未接收 onClick 事件

    我正在制作一个日期选择器活动 看起来像滚动的 30 天月份 日历 想想 Outlook 日历 日期选择器包含 MonthView 视图的 ListView 用于滚动 每个视图都是各个日期的 TableView MonthView 中的每一天
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 如何从输出迭代器获取值类型?

    假设我有一个 C 容器 例如 MyContainer 包含的对象存储为void 指针 迭代此容器元素的唯一方法是通过两个接口函数 getFirstElem MyContainer const void 输出容器的第一个元素 getNextE
  • 为什么组件中的 React Native 函数没有“function”关键字?

    在 javascript 函数中声明为function myFuncName 但 React React Native 函数省略了该关键字 这是 ES6 JSX 或 React 特有的吗 这是ES6的一个特性 更多信息请访问https ba
  • C#/ODP.NET:大 IN 子句解决方法

    我们有一个 C 组件 可以处理将任意大小的元素列表附加到半任意 SQL 的 IN 子句中SELECT查询 本质上这可以归结为接收类似的东西 SELECT COUNT FROM a WHERE b IN 其中 是允许组件修改的查询的唯一部分
  • Python - 将日期戳添加到文本文件

    在Python v2中 有没有办法获取日期 时间戳并将其放入创建新的文本文件中 IE 当我想创建一个新的文本文件并将程序的内容写入其中时 它将创建一个包含时间 日期的新文本文件 谢谢你的帮助 import datetime def time
  • Google API oauth httpd 服务器与 Python 中的 SABNzbd+ 冲突

    我正在编写一个与 Google API 交互的 Python 应用程序 并需要通过 oauth2 进行用户身份验证 我目前正在设置一个本地身份验证服务器 以接收从 Google 的 oauth 服务器返回的 oauth2 身份验证代码 基本
  • 在 IE8 中可单击带警报的禁用按钮(Asp.net 网站中的浏览器兼容性问题)

    我已经禁用了链接按钮和图像按钮 位于链接按钮内 以便我可以显示警报 并且它在 Chrome 中工作正常 但是当我在 IE8 中打开它时 图像被禁用 但是当我单击它时 它会显示popup 您确定要删除该用户吗 为什么我在 IE8 和 IE7
  • ClassNotFoundException:使用服务组合时未找到 com.mysql.jdbc.Driver

    我正在使用 servicemix 4 4 1 和 maven 3 0 4 我对 servicemix java 世界非常陌生 我的主要知识是 c php 我已将以下内容添加到我的路线之一
  • 恢复后在 Android 中丢失 OpenGL 纹理

    我的游戏运行正常 除非我按下 HOME 按钮然后继续 需要做什么才能再次使用纹理 我尝试在 GLSurfaceView 上调用 onPause 和 onResume 当调用活动的 onPause 和 onResume 时 有什么想法我可能做
  • WCF MSMQ 单元测试

    我使用 WCF 创建了一个自定义 msmq 服务 它使用自定义绑定 因为它需要在通道层执行一些自定义逻辑 在通道层调用另一个 wcf 服务 该服务将成为未来几年我们系统的核心功能 我想尽我所能确保服务稳健 但是 我不知道从哪里开始 即测试响
  • 为什么.NET的条件属性会导致副作用被消除?

    我读到了关于Conditional今天的属性 根据 MSDN 正在申请ConditionalAttribute方法的调用指示编译器不应将对该方法的调用编译为 Microsoft 中间语言 MSIL 除非与关联的条件编译符号Condition
  • 使用'printf'在C中打印%符号[重复]

    这个问题在这里已经有答案了 我正在尝试打印一个 标志使用printf https en wikipedia org wiki Printf format string 我尝试过但没有运气 printf 我确信这真的很简单 但我刚刚开始使用
  • 如何提示内容管理器选择器直接在 ACTION_OPEN_DOCUMENT_TREE 的可选位置上打开

    当你使用ACTION OPEN DOCUMENT TREE要选择在 Android 11 中存储文件的路径的权限 默认情况下 默认的 Android 内容管理器会在最近使用的路径和按钮上打开 使用此文件夹 由于某种原因 即使该路径是可访问路
  • C++中如何为同一个类定义不同的类型

    我希望有几种类型共享相同的实现 但在 C 中仍然是不同的类型 为了用一个简单的例子来说明我的问题 我想要一个苹果 橙子和香蕉的类 它们都具有相同的操作和相同的实现 我希望它们有不同的类型 因为我想通过类型安全来避免错误 class Appl
  • 从“WordOpenXML”转换为内存中 System.IO.Packaging.Package

    当使用 VSTO 2012 操作 MS Word 文档时 我看到该文档有一个WordOpenXMLstring 属性 它是构成 docx 包的所有文件的 XML 表示形式 当将此 Word 文档保存为 docx 时 这些文件将保存到磁盘 我
  • 合并集合并保持顺序的最有效方法?

    我有3个频道 byte Red byte Green byte Blue 我需要将它们中的所有值复制到byte Red Length Green Length Blue Length PA 以便 PA 0 Red 0 PA 1 Green
  • 如何在套接字关闭时唤醒 select()?

    我目前正在使用选择循环来管理代理中的套接字 该代理的要求之一是 如果代理向外部服务器发送消息并且在一定时间内没有得到响应 则代理应该关闭该套接字并尝试连接到辅助服务器 关闭发生在单独的线程中 而选择线程则阻塞等待活动 我无法弄清楚如何专门检