首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强ASIO和文件描述符重用

增强ASIO和文件描述符重用
EN

Stack Overflow用户
提问于 2022-01-07 20:52:12
回答 2查看 92关注 0票数 1

我有多线程(linux)服务器,它通过套接字对象在同一个本机文件描述符上注册async_writes和async_reads。当服务器中断连接时,我注意到在非常重的负载下,在非常罕见的情况下,客户端会收到一条错误的第一条消息。

跟踪它,async_read检测到套接字上的错误并关闭套接字。这将关闭本机文件描述符。如果该文件描述符在原始async_write有机会触发之前被重用,它将发现它的本机文件描述符有效并继续发送它的消息(实际上是来自上一次会话的消息)。

修复这个问题的唯一方法是让async_read和async_write回调知道是否有其他回调注册,并且只有当它是最后一个回调时才关闭套接字。

有人看过这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2022-01-07 21:50:46

还没看过,但听起来很有道理。虽然我很惊讶地看到一个新的本机文件描述符得到了与最近关闭的描述符完全相同的数字。

您可能希望将套接字放在shared_ptr中,并在async_read和async_write中查询shared_ptr::is_unique。这将是让其他回调知道两个回调是否都已注册的最简单方法。如果is_unique是真的,您可以确保没有其他人仍然在使用这个套接字,并且可以关闭它。

因此,如果删除连接,async_read可以检查is_unique。如果为真,请关闭套接字。在这两种情况下,都不要使用shared_ptr。

然后,当async_write也启动时,它将发现is_unique为真,并且可以关闭套接字,除非async_read已经关闭了它。

当然,唯一的缺点是:为了关闭套接字,async_write也必须启动(可能是使用错误代码)。

票数 0
EN

Stack Overflow用户

发布于 2022-01-07 22:06:51

哦,我在生产代码中见过这个。(很有趣:我们将讨论TCP套接字到mysql服务器上的专有协议)。问题是当某些线程通过使用本机句柄(fd)关闭套接字来“处理”错误时。不要。请使用关机(可能与取消),让析构函数处理关闭。当然,真正的问题是句柄(fd)的不拥有副本是资源竞争的原因。

关键说明:

跟踪它,async_read检测到套接字上的错误并关闭套接字。这将关闭本机文件描述符。

对于Asio本身来说,这显然是不正确的。也许您在完成处理程序中有(第三方)代码,但是正如我前面提到的,您不能这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70627044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档