|
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