Boost C++ Libraries: Ticket #9406: [asio] The asio handle shouldnot be called https://svn.boost.org/trac10/ticket/9406 <p> I want to write a UDP server, which can send and receive package. The following is the demo code: </p> <p> <em> Begin of code #include "stdafx.h" #include "boost/bind.hpp" #include "boost/asio.hpp" </em></p> <p> class UDPServer { public: </p> <blockquote> <p> UDPServer() </p> <blockquote> <p> :m_socket(m_io_service), m_timer(m_io_service) </p> </blockquote> <p> { } </p> </blockquote> <blockquote> <p> virtual ~UDPServer() { </p> </blockquote> <blockquote> <p> } </p> </blockquote> <blockquote> <p> void Initialize(const std::string&amp; strIP, int nPort) { </p> <blockquote> <p> boost::system::error_code ec; boost::asio::ip::address ad = boost::asio::ip::address::from_string(strIP, ec); boost::asio::ip::udp::endpoint ep(ad, nPort); m_socket.open(ep.protocol()); m_socket.bind(ep, ec); { </p> <blockquote> <p> <em> TEST CODE: boost::asio::ip::udp::endpoint ep(boost::asio::ip::address::from_string("172.18.8.111", ec), 8001); m_vServerGroup.push_back(ep); </em></p> </blockquote> <p> } </p> </blockquote> <p> } </p> </blockquote> <blockquote> <p> void Start() { </p> <blockquote> <p> <a class="missing wiki">StartAsyncReceiveFrom</a>(); <a class="missing wiki">NoticeSelfUp</a>(); while (true) { </p> <blockquote> <p> boost::system::error_code ec; m_io_service.poll(ec); </p> </blockquote> <p> } </p> </blockquote> <p> } </p> </blockquote> <blockquote> <p> void SendUDPMsg(const char* pMsg, int nLen, boost::asio::ip::udp::endpoint&amp; dest_ep) { </p> <blockquote> <p> m_socket.async_send_to( </p> <blockquote> <p> boost::asio::buffer(pMsg, nLen), dest_ep, boost::bind(&amp;UDPServer::<a class="missing wiki">HandleSendTo</a>, this, _1, _2, boost::ref(dest_ep))); </p> </blockquote> </blockquote> <p> } </p> </blockquote> <p> protected: </p> <blockquote> <p> void <a class="missing wiki">NoticeSelfUp</a>() { </p> <blockquote> <p> size_t count = m_vServerGroup.size(); char* pBuff = "this is up"; for (size_t i = 0; i &lt; count; ++i) { </p> <blockquote> <p> SendUDPMsg(pBuff, strlen(pBuff), m_vServerGroup[i]); </p> </blockquote> <p> } m_timer.expires_from_now(boost::posix_time::seconds(5)); m_timer.async_wait(boost::bind(&amp;UDPServer::<a class="missing wiki">NoticeSelfUp</a>, this)); </p> </blockquote> <p> } </p> </blockquote> <blockquote> <p> void <a class="missing wiki">HandleReceiveFrom</a>(const boost::system::error_code&amp; ec, size_t bytes_recvd) { </p> <blockquote> <p> if (ec) { </p> <blockquote> <p> std::cout&lt;&lt;"<a class="missing wiki">HandleReceiveFrom</a> error: \t"&lt;&lt;ec&lt;&lt;std::endl; </p> </blockquote> <p> } else { </p> <blockquote> <p> <em> TODO </em></p> </blockquote> <p> } <a class="missing wiki">StartAsyncReceiveFrom</a>(); </p> </blockquote> <p> } </p> </blockquote> <blockquote> <p> void <a class="missing wiki">HandleSendTo</a>(const boost::system::error_code&amp; ec, size_t bytes_sent, boost::asio::ip::udp::endpoint&amp; ep) { </p> <blockquote> <p> if (ec) { </p> <blockquote> <p> std::cout&lt;&lt;"<a class="missing wiki">HandleReceiveFrom</a> error: \t"&lt;&lt;ec&lt;&lt;"\t"&lt;&lt;ep&lt;&lt;std::endl; </p> </blockquote> <p> } else { </p> <blockquote> <p> <em> TODO </em></p> </blockquote> <p> } </p> </blockquote> <p> } </p> </blockquote> <blockquote> <p> void <a class="missing wiki">StartAsyncReceiveFrom</a>() { </p> <blockquote> <p> m_socket.async_receive_from(boost::asio::buffer(m_buff, max_length), </p> <blockquote> <p> m_sender_point, boost::bind(&amp;UDPServer::<a class="missing wiki">HandleReceiveFrom</a>, this, _1, _2)); </p> </blockquote> </blockquote> <p> } </p> </blockquote> <p> private: </p> <blockquote> <p> boost::asio::io_service m_io_service; boost::asio::ip::udp::socket m_socket; boost::asio::ip::udp::endpoint m_sender_point; boost::asio::deadline_timer m_timer; std::vector&lt;boost::asio::ip::udp::endpoint&gt; m_vServerGroup; enum { max_length = 1024 }; char m_buff[max_length]; </p> </blockquote> <p> }; </p> <p> int _tmain(int argc, _TCHAR* argv[]) { </p> <blockquote> <p> UDPServer server; server.Initialize("172.18.8.111", 8000); server.Start(); return 0; </p> </blockquote> <p> } </p> <p> <em> End of code </em></p> <p> What's more, localmachine IP is 172.18.8.111, the port number 8001 is not opened. After I call SendUDPMsg, the handle UDPServer::<a class="missing wiki">HandleReceiveFrom</a> is called, but there is no receive operation for the socket, I just called the send function. In my opinion, the <a class="missing wiki">HandleReceiveFrom</a> should not be called! </p> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/9406 Trac 1.4.3 icerlion@… Mon, 18 Nov 2013 09:33:04 GMT attachment set https://svn.boost.org/trac10/ticket/9406 https://svn.boost.org/trac10/ticket/9406 <ul> <li><strong>attachment</strong> → <span class="trac-field-new">asio_error.cpp</span> </li> </ul> <p> test code for this issue </p> Ticket chris_kohlhoff Mon, 18 Nov 2013 11:26:06 GMT status changed; resolution set https://svn.boost.org/trac10/ticket/9406#comment:1 https://svn.boost.org/trac10/ticket/9406#comment:1 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">invalid</span> </li> </ul> <p> asio_error.cpp, line 85 </p> Ticket icerlion@… Mon, 18 Nov 2013 12:20:39 GMT <link>https://svn.boost.org/trac10/ticket/9406#comment:2 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9406#comment:2</guid> <description> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/9406#comment:1" title="Comment 1">chris_kohlhoff</a>: </p> <blockquote class="citation"> <p> asio_error.cpp, line 85 </p> </blockquote> <p> Thank you for your replying, but I don't understand your meaning. How should I do to fix this problem? How to set to invalid? Can you write some code? </p> </description> <category>Ticket</category> </item> <item> <dc:creator>chris_kohlhoff</dc:creator> <pubDate>Mon, 18 Nov 2013 21:52:03 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9406#comment:3 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9406#comment:3</guid> <description> <p> Change line 85 from: </p> <pre class="wiki">std::cout&lt;&lt;"HandleReceiveFrom error: \t"&lt;&lt;ec&lt;&lt;"\t"&lt;&lt;ep&lt;&lt;std::endl; </pre><p> to: </p> <pre class="wiki">std::cout&lt;&lt;"HandleSendTo error: \t"&lt;&lt;ec&lt;&lt;"\t"&lt;&lt;ep&lt;&lt;std::endl; </pre> </description> <category>Ticket</category> </item> </channel> </rss>