私は、 Using ZeroMQ together with Boost::ASIOの POSIX 風のプラットフォーム (MacOS) で 0MQ と Boost.Asio を使用することに関する優れたアドバイスに従っています。残念ながら、私は POSIX っぽいものと Windows の両方で動作する必要があるコードを書いています。これまでのところ、このアドバイスを Windows 側に翻訳しようとしてもうまくいきません。Windows で getsockopt(ZMQ_FD) によって返される型を一致させる方法と、boost::asio::posix::stream_descriptor に相当する Windows とすべきものを理解できないようです。これが私が試したことです:
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, zfd);
そして、コンパイルしようとするとエラーが発生します。
2>Z:\zee-zmq-socket.cpp(14): error C2664: 'boost::asio::windows::basic_stream_handle<>::basic_stream_handle(boost::asio::io_service &,void *const &)' : cannot convert parameter 2 from 'SOCKET' to 'void *const &'
2> Reason: cannot convert from 'SOCKET' to 'void *const '
2> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
これまでのところ、私の Google-fu は弱いものでした。POSIX風にBoost.Asioと0MQを扱う例しか見つけられないようです。SOCKET から に正しく取得するために何をする必要があるのか わかりませんvoid * const
。私が見つけた最も近いアドバイスは、0MQ と libcurl の組み合わせに関するものです: http://comments.gmane.org/gmane.comp.lib.boost.asio.user/5071。また、このアドバイスは、私のコンパイルの問題が、水面下に隠れている非常に厄介な氷山の一角にすぎないことに不安を感じさせます。特に、
割り当てはあるが、boost::asio::ip::tcp::sockets の解放関数がない理由は、ソケットが完了ポートに「バインド」されると、それを「バインド解除」または「バインド」できないためです。それを別の完了ポートに。
そのため、私が知らない可能性があり、コンパイル時のエラーとして現れるほど丁寧ではない他の落とし穴があるのではないかと心配しています。よろしくお願いします。