Asio仅在某些系统上存在错误的文件描述符 最近我在C++中用一个昏昏欲睡的不合作机器人库写了一个不和谐的机器人。 现在,这里的问题是,当我运行bot时,它会显示以下错误: [2021-05-29 18:30:29] [info] Error getting remote endpoint: asio.system:9 (Bad file descriptor) [2021-05-29 18:30:29] [error] handle_connect error: Timer Expired [2021-05-29 18:30:29] [info] asio async_shutdown error: asio.ssl:336462100 (uninitialized)

Asio仅在某些系统上存在错误的文件描述符 最近我在C++中用一个昏昏欲睡的不合作机器人库写了一个不和谐的机器人。 现在,这里的问题是,当我运行bot时,它会显示以下错误: [2021-05-29 18:30:29] [info] Error getting remote endpoint: asio.system:9 (Bad file descriptor) [2021-05-29 18:30:29] [error] handle_connect error: Timer Expired [2021-05-29 18:30:29] [info] asio async_shutdown error: asio.ssl:336462100 (uninitialized),c++,networking,boost-asio,C++,Networking,Boost Asio,现在,我到处搜索这可能是由什么触发的,但答案总是说,像插座没有打开等等。 问题是,它在很多系统上都能工作,但昨天我租了一个虚拟机(和我的电脑是同一个系统),这似乎是唯一一个给我这个问题的 这可能是什么原因 编辑:我被指示展示一个可复制的示例,但我不确定我将如何编写一个最小的示例,这就是我链接有问题的机器人的原因: 更新: 我在正在使用的库中进行了一些修补,并能够提高Websocketpp日志级别,幸好我从中又获得了一行信息: [2021-05-29 23:49:08] [fail] WebSo

现在,我到处搜索这可能是由什么触发的,但答案总是说,像插座没有打开等等。 问题是,它在很多系统上都能工作,但昨天我租了一个虚拟机(和我的电脑是同一个系统),这似乎是唯一一个给我这个问题的

这可能是什么原因

编辑:我被指示展示一个可复制的示例,但我不确定我将如何编写一个最小的示例,这就是我链接有问题的机器人的原因:

更新: 我在正在使用的库中进行了一些修补,并能够提高Websocketpp日志级别,幸好我从中又获得了一行信息:

[2021-05-29 23:49:08] [fail] WebSocket Connection Unknown - "" /?v=8 0 websocketpp.transport:9 Timer Expired

在未连接/不再连接的套接字上执行此操作时,会触发错误

例如,当您在IO错误后尝试使用套接字打印端点时,就会发生这种情况。通常的解决方法是在建立连接后立即存储远程端点的副本,这样就不必在太晚时检索它


关于为什么会发生在特定VM上的问题,您必须将焦点转移到根本原因上。可能是
accept
失败(可能是由于文件描述符数量、可用内存等限制)

请显示一个hmm。。。我有4gb内存,所以这不是原因。我还将文件描述符设置为4096,因此两者都不是。这就是为什么我建议研究根本原因。你不太可能完全凭意志“实现它”。也许你可以添加跟踪/错误处理,统计我看到你添加了“计时器过期”信息。在这种情况下,很可能是过期关闭了套接字,然后代码的其他部分尝试执行
remote\u endpoint
。(事实上,你几乎可以猜到,在你发布的日志行中,他们可能正在处理一个类似的问题,导致显示“未知连接”),这意味着在建立成功连接之前超时?这是一个选项。也有可能在套接字关闭后计时器刚好过期。或者,过期本身导致套接字关闭,之后您又进行了另一次对
remore\u endpoint
的无防护调用。在所有情况下,这可能是一种异步“竞争”,这在Asio中非常常见(参见示例)