使用 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 的构建过程中你得到了一个段错误。解决方法是交换mSocketmService 的顺序:

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中io_service类的几种使用

boost::asio::io_service类

Boost::asio::serial_port - 迁移到 boost 1.7.1 版时使用 io_service.read() 函数

C++ - 几个 Boost.Asio 相关问题

boost::io_service解读