1

我正在为运行 Windows 7 Embedded 的系统开发程序。该程序使用boost::asio套接字在 UDP 和 TCP 套接字上进行通信(它充当 DHCP 服务器,由 RESTful 接口控制)。

通常它工作正常。但是,有时它不会正确初始化并且不会响应任何 DHCP 或 HTTP 消息。我怀疑这是因为程序在底层Winsock准备好之前就已经启动了。在使用下面的代码创建和套接字 Winsock之前,我天真地尝试等待初始化:boost::asio::io_service

WSADATA wsaData;
while (WSAStartup(MAKEWORD(2,2), &wsaData))
{
  BOOST_LOG_TRIVIAL(error) << "WSAStartup failed, waiting...";
  boost::this_thread::sleep_for(COMMS_DELAY_PERIOD);
}

但我现在意识到在 Windows 系统上调用 main之前boost::asio已初始化。请参阅以下代码:winsock_init.hpp

// Static variable to ensure that winsock is initialised before main, and
// therefore before any other threads can get started.
static const winsock_init<>& winsock_init_instance = winsock_init<>(false);

有没有办法确保asio在使用它之前在 Windows 系统中正确初始化,而不用编辑 DLL?

4

1 回答 1

0

现在意识到有关 DLL 的注释winsock_init.hpp只是一个示例,该asio库没有内置到 DLL 中。此外,示例代码仅适用于 MSVC(并不奇怪,因为它是特定于 Windows 的)。然而,在我们的项目中,我们在 Qt 下使用 MSVC 和 MinGw (gcc) 构建。以下代码对我们有用:

#include <boost/asio/detail/winsock_init.hpp>
#ifdef _MSC_VER
  #pragma warning(push)
  #pragma warning(disable:4073)
  #pragma init_seg(lib)
  boost::asio::detail::winsock_init<>::manual manual_winsock_init;
  #pragma warning(pop)
#else // using MinGw (gcc)
  boost::asio::detail::winsock_init<>::manual manual_winsock_init
    __attribute__ ((init_priority (101)));
#endif
于 2013-11-13T18:22:29.150 回答