Boost logo

Boost Users :

Subject: Re: [Boost-users] Boost.Asio, 0MQ, and Windows
From: Damien Kick (dkick_at_[hidden])
Date: 2013-08-11 18:00:22


On Aug 11, 2013, at 4:32 PM, Damien Kick <dkick_at_[hidden]<mailto:dkick_at_[hidden]>> wrote:

Yeah, so far I've been having very good luck with Asio and 0MQ on POSIX. But I'm still stuck on Windows :( The code that I was able to get to compile is not happy at runtime.

int main()
{
   zmq::context_t zenv(1);
   zmq::socket_t zocket(zenv, ZMQ_PUSH);
   SOCKET zfd;
   std::size_t zfd_size = sizeof(zfd);
   zocket.getsockopt(ZMQ_FD, &zfd, &zfd_size);
   boost::asio::windows::stream_handle::native_handle_type
       zfd_native(&zfd);
   boost::asio::io_service ios;
   boost::asio::windows::stream_handle io(ios, zfd_native);
}

Stepping line-by-line in the debugger for Visual Studio 2010, when I get to the line attempting to create the windows::stream_handle, I get

Unhandled exception at 0x77b815de in test-zee-zmq-socket.exe: Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x00c1fc7c..

And so there obviously must be more to creating a windows::stream_handle than this but I'm still quite in the dark as to what that might be. The stack trace I'm getting doesn't help me much, either, but I am also am quite ignorant about most things Windows.

  ntdll.dll!77b815de()
  [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
  ntdll.dll!77b815de()
  ntdll.dll!77b7014e()
  KernelBase.dll!7608c41f()
> msvcr100d.dll!_nh_malloc_dbg_impl(unsigned int nSize=8, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x00c1fb0c) Line 239 + 0x19 bytes C++
  msvcr100d.dll!_nh_malloc_dbg(unsigned int nSize=8, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0) Line 302 + 0x1d bytes C++
  msvcr100d.dll!malloc(unsigned int nSize=12712804) Line 56 + 0x15 bytes C++
  00c1fb64()
  00cc8220()

I've also tried

int main()
{
   zmq::context_t zenv(1);
   zmq::socket_t zocket(zenv, ZMQ_PUSH);
   SOCKET zfd;
   std::size_t zfd_size = sizeof(zfd);
   zocket.getsockopt(ZMQ_FD, &zfd, &zfd_size);
   boost::asio::io_service ios;
   boost::asio::windows::stream_handle io(ios, GetStdHandle(zfd));
}

Which also compiles but then I'm still getting the same exception at runtime. And so apparently a SOCKET is not the same as a HANDLE (?), even though <http://msdn.microsoft.com/en-us/library/windows/desktop/ms741476(v=vs.85).aspx> tells me that

The WPUCreateSocketHandle function creates a new socket handle.
Syntax
C++

SOCKET WPUCreateSocketHandle(
  _In_ DWORD dwCatalogEntryId,
  _In_ DWORD_PTR dwContext,
  _Out_ LPINT lpErrno
);

<sigh/> It's so annoying because I have this feeling that there is probably just one stupid little conversion function that I need to be calling but it continues to elude me :(

________________________________

This e-mail and any attachments are confidential. If it is not intended for you, please notify the sender, and please erase and ignore the contents.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net