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);

asioDLL を編集せずに、使用する前に Windows システムで正しく初期化されていることを確認する方法はありますか?

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 に答える