使用 boost io_service 初始化 boost udp 套接字时出错
Posted
技术标签:
【中文标题】使用 boost io_service 初始化 boost udp 套接字时出错【英文标题】:Error initializing a boost udp socket with a boost io_service 【发布时间】:2014-10-07 18:44:23 【问题描述】:我在我的项目中使用 Visual Studio 2012,而且我是使用 boost 的新手,所以我在尝试初始化它时遇到了运行时问题:
FClient::FClient(const std::string & logName, const std::string & logPassword, udp::endpoint hostpoint) : mSocket(mService), mLogName(logName), mLogPassword(logPassword), mEndPoint(hostpoint)
mSocket 是 boost udp 套接字,mService 是 boost asio io_service(都是 FClient 的私有成员),我猜其余的调用(基本上是字符串初始化)对于检测错误没有用处。我希望错误是在类型为 mSocket(mService) 的初始化上:
boost::asio::ip::udp::socket(boost::asio::io_service)
Visual Studio 调用堆栈: http://pastebin.com/fjwWbhst
我正在使用带有 boost 1.5.6 的 Windows 8,我正在定义: -D_WIN32_WINNT=0x0602
谢谢,
-lilEzek
【问题讨论】:
如果没有更详细的例子,就不可能说。你能创建一个最小的完整示例来重现问题吗? 请显示FClient
定义(及其成员)
错误是什么?抛出异常?崩溃?
【参考方案1】:
我知道这是旧的,但我刚刚遇到了类似的问题并遇到了这篇文章。我发现问题是在构造 IO 服务之前正在初始化套接字。所以当使用非构造的IO服务调用socket构造函数时,会导致segfault。
在 C++ 中,类成员的构造顺序由它们在类声明中列出的顺序决定(通常在 .h 文件中)。因此,如果 FClient
声明如下:
class FClient
// ...
boost::asio::ip::udp::socket mSocket;
boost::asio::io_service mService;
// ...
;
在FClient::mSocket
的构建过程中你得到了一个段错误。解决方法是交换mSocket
和mService
的顺序:
class FClient
// ...
boost::asio::io_service mService;
boost::asio::ip::udp::socket mSocket;
// ...
;
这确保mService
在被传递给mSocket
构造函数之前被构造。
【讨论】:
【参考方案2】:我将关闭这个问题,因为我修复了它,使用 mSocket 一个指针,并在其他地方初始化它。无论如何,感谢您提供的帮助。
【讨论】:
以上是关于使用 boost io_service 初始化 boost udp 套接字时出错的主要内容,如果未能解决你的问题,请参考以下文章
Boost Asio 沿一次性对象共享相同的 io_service
Boost::asio::serial_port - 迁移到 boost 1.7.1 版时使用 io_service.read() 函数