在linux中调用socket.close之后,socket.read_some需要相当长的时间才能返回
It takes quite a moment for socket.read_some to return after socket.close has been called, in linux
我正在使用Boost.Asio作为一个简单的套接字库。
当我打开一个套接字时,我创建一个线程,该线程在该套接字上不断读取,并在套接字关闭或发生其他错误时返回。
while((read = socket->read_some(buf, ec)) != 0) {
// deal with bytes read
}
此代码在 Windows 和 Mac 上运行良好。但是对于 linux,当套接字从主线程关闭时,socket::read_some
需要很长时间才能返回 - 我发现它超过 2 分钟。
我能做些什么来改善这一点吗?
如果需要取消功能,请使用异步套接字。不要使用同步方法,例如 read_some
。这已经在asio-users邮件列表中进行了无限的讨论。在提升错误跟踪器上也有一张票讨论它。
另请参阅我对类似问题的回答。
最后我找到了原因:在 Linux 中,如果你用 socket::close 关闭一个套接字,那么这个套接字就不会关闭。您必须正常关闭套接字才能成功关闭它。
socket->shutdown(shutdown_both); // add this
socket->close();
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 设置boost socket.connect的超时时间
- c++中socket编程中的Select()总是给出时间错误
- 在linux中调用socket.close之后,socket.read_some需要相当长的时间才能返回