<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3140765825091878616</id><updated>2024-08-28T15:43:15.835-07:00</updated><category term="Asio"/><category term="asynchronous"/><category term="boost"/><category term="c++"/><category term="net-snmp"/><title type='text'>C++ Boost tips and tricks</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog-moshe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3140765825091878616/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog-moshe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/13074761233492491159</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3140765825091878616.post-7332287453294242086</id><published>2012-10-13T14:37:00.000-07:00</published><updated>2012-10-14T05:45:10.359-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Asio"/><category scheme="http://www.blogger.com/atom/ns#" term="asynchronous"/><category scheme="http://www.blogger.com/atom/ns#" term="boost"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="net-snmp"/><title type='text'>Boost asio with Net-Snmp</title><content type='html'>&lt;div dir=&quot;rtl&quot; style=&quot;text-align: right;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach.&amp;nbsp;Net-SNMP is open source implementation for SNMP protocol. Here I will show you how to integrate Net-SNMP to Boost Asio asynchronous model.&lt;/span&gt;&lt;/div&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%; text-align: center;&quot;&gt;&lt;i&gt;&lt;u&gt;Step 1 - Wrap SNMP socket with boost socket&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;pre style=&quot;background-color: white; font-family: Consolas; font-size: 13px; line-height: 115%;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;//&amp;nbsp;The&amp;nbsp;glue&amp;nbsp;between&amp;nbsp;asio&#39;s&amp;nbsp;sockets&amp;nbsp;and&amp;nbsp;the&amp;nbsp;net-snmp&amp;nbsp;library.&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt;&amp;nbsp;snmp_connection
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_connection(boost::asio::io_service&amp;amp;&amp;nbsp;io_service)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;snmp_socket_(io_service),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_handle_(NULL)&amp;nbsp;{};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~snmp_connection()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_close(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;snmp_handle_);&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;connect(&lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt;&amp;nbsp;version,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;peername,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;community);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;async_snmp_get(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;snmp_oid,&amp;nbsp;SNMPHandler&amp;nbsp;handler);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;async_snmp_set(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;snmp_oid,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;type,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;value,&amp;nbsp;SNMPHandler&amp;nbsp;handler);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udp::socket&amp;nbsp;snmp_socket_;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;*snmp_handle_;
};&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; font-family: Consolas; font-size: 13px; line-height: 115%;&quot;&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white;&quot;&gt;&lt;pre style=&quot;font-family: Consolas; font-size: 13px; line-height: 115%;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_connection::connect(&lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt;&amp;nbsp;version,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;peername,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;community){&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px; line-height: 115%;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;    struct&lt;/span&gt;&amp;nbsp;snmp_session&amp;nbsp;sess;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_init(&amp;amp;sess);   &lt;span style=&quot;color: green;&quot;&gt;/*&amp;nbsp;initialize&amp;nbsp;session&amp;nbsp;*/&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.version&amp;nbsp;=&amp;nbsp;SNMP_VERSION_2c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.peername&amp;nbsp;=&amp;nbsp;strdup(peername.c_str());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.community&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;reinterpret_cast&lt;/span&gt;&amp;lt;u_char*&amp;gt;(strdup(community.c_str()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.community_len&amp;nbsp;=&amp;nbsp;community.size();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.callback&amp;nbsp;=&amp;nbsp;asynch_response;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_handle_&amp;nbsp;=&amp;nbsp;snmp_sess_open(&amp;amp;sess);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(sess.peername);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(sess.community);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netsnmp_transport&amp;nbsp;*transport&amp;nbsp;&amp;nbsp;=&amp;nbsp;snmp_sess_transport(&amp;nbsp;snmp_handle_&amp;nbsp;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_socket_.assign(boost::asio::ip::udp::v4(),&amp;nbsp;transport-&amp;gt;sock);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;//&amp;nbsp;Put&amp;nbsp;the&amp;nbsp;socket&amp;nbsp;into&amp;nbsp;non-blocking&amp;nbsp;mode.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udp::socket::non_blocking_io&amp;nbsp;non_blocking_io(&lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_socket_.io_control(non_blocking_io);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;span style=&quot;font-size: 13px; line-height: 115%;&quot;&gt;&lt;span style=&quot;font-family: Consolas;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;


&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Here we created snmp_connection class, which is the glue between asio&#39;s socket and the net-snmp socket. 
It contains the following:&amp;nbsp;&lt;/span&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Boost UDP socket - SNMP sockets are usually UDP Sockets.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Session handler – Net-SNMP Single API for thread safety.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;io::service – to register out boost socket to it for read/writ monitoring.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;In the connect function we&amp;nbsp;assign&amp;nbsp;the SNMP native socket to the boost socket and change the socket for none blocking. This will ensure that the send and read&amp;nbsp;operations&amp;nbsp;will not block and will&amp;nbsp;return&amp;nbsp;immediately.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 13px; line-height: 115%;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: white;&quot;&gt;&lt;/pre&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: small;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;Step 2 - Create SNMP request and SNMP response&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;completion&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: small;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;handlers&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;typedef&lt;/span&gt;&amp;nbsp;boost::function&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;(string)&amp;gt;&amp;nbsp;SNMPHandler;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt;&amp;nbsp;snmp_connection
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_connection(boost::asio::io_service&amp;amp;&amp;nbsp;io_service)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;snmp_socket_(io_service),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_handle_(NULL)&amp;nbsp;{};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~snmp_connection()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_close(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;snmp_handle_);&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;connect(&lt;span style=&quot;color: blue;&quot;&gt;long&lt;/span&gt;&amp;nbsp;version,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;peername,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;community);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;async_snmp_get(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;snmp_oid,&amp;nbsp;SNMPHandler&amp;nbsp;handler);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;async_snmp_set(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;snmp_oid,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;type,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;value,&amp;nbsp;SNMPHandler&amp;nbsp;handler);&lt;/pre&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt;:
&lt;pre style=&quot;background-position: initial initial; background-repeat: initial initial; font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;handle_snmp_req(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;boost::system::error_code&amp;nbsp;&amp;amp;ec,&amp;nbsp;std::size_t&amp;nbsp;bytes_transferred,&amp;nbsp;
       &amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;struct&lt;/span&gt;&amp;nbsp;snmp_pdu&amp;nbsp;*pdu,&amp;nbsp;SNMPHandler&amp;nbsp;handler);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;handle_snmp_res(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;boost::system::error_code&amp;nbsp;&amp;amp;ec,&amp;nbsp;std::size_t&amp;nbsp;bytes_transferred,&amp;nbsp;
       &amp;nbsp;SNMPHandler&amp;nbsp;handler);
&lt;/pre&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udp::socket&amp;nbsp;snmp_socket_;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;*snmp_handle_;
};
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_connection::async_snmp_get(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;amp;&amp;nbsp;snmp_oid,&amp;nbsp;SNMPHandler&amp;nbsp;handler)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;struct&lt;/span&gt;&amp;nbsp;snmp_pdu&amp;nbsp;*pdu&amp;nbsp;=&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oid&amp;nbsp;anOID[MAX_OID_LEN];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t&amp;nbsp;anOID_len&amp;nbsp;=&amp;nbsp;MAX_OID_LEN;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pdu&amp;nbsp;=&amp;nbsp;snmp_pdu_create(SNMP_MSG_GET);&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(!snmp_parse_oid(snmp_oid.c_str(),&amp;nbsp;anOID,&amp;nbsp;&amp;amp;anOID_len))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_perror(snmp_oid.c_str());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;error&amp;nbsp;snmp_parse_oid&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_add_null_var(pdu,&amp;nbsp;anOID,&amp;nbsp;anOID_len);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_socket_.async_send(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::asio::null_buffers(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::bind(&amp;amp;snmp_connection::handle_snmp_req,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;,&amp;nbsp;boost::asio::placeholders::error,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::asio::placeholders::bytes_transferred,&amp;nbsp;pdu,&amp;nbsp;handler));
}

&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white;&quot;&gt;&lt;pre&gt;&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_connection::handle_snmp_req(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;boost::system::error_code&amp;nbsp;&amp;amp;ec,&amp;nbsp;std::size_t&amp;nbsp;bytes_transferred,
         &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;struct&lt;/span&gt;&amp;nbsp;snmp_pdu&amp;nbsp;*pdu,&amp;nbsp;SNMPHandler&amp;nbsp;handler)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;snmp_socket_.is_open()){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(ec)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;error&amp;nbsp;snmp_connection::handle_snmp_req&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;//&amp;nbsp;Notify&amp;nbsp;net-snmp&amp;nbsp;library&amp;nbsp;that&amp;nbsp;it&amp;nbsp;can&amp;nbsp;perform&amp;nbsp;a&amp;nbsp;write.&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_send(snmp_handle_,&amp;nbsp;pdu);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_socket_.async_receive(&amp;nbsp;&amp;nbsp;boost::asio::null_buffers(),&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::bind(&amp;amp;snmp_connection::handle_snmp_res,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred,&amp;nbsp;handler));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;/pre&gt;
&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_connection::handle_snmp_res(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;boost::system::error_code&amp;nbsp;&amp;amp;ec,&amp;nbsp;std::size_t&amp;nbsp;bytes_transferred,&amp;nbsp;
         &amp;nbsp;&amp;nbsp;SNMPHandler&amp;nbsp;handler)&lt;/pre&gt;
&lt;pre style=&quot;font-size: 13px;&quot;&gt;&lt;span style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;snmp_socket_.is_open())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(ec)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;error&amp;nbsp;snmp_connection::handle_snmp_res&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd_set&amp;nbsp;snmp_fds;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_ZERO(&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(snmp_socket_.native(),&amp;nbsp;&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_read(snmp_handle_,&amp;nbsp;&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;The async_snmp_get is responsible for creating the snmp get message and letting ios::service know that it is ready for send by calling async_send. we are using null_buffer because we don&#39;t want that asio will write the data, instead we provide a handle_snmp_req&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: center; white-space: normal;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;completion &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;handler which will write the data using net-snmp API.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;font-size: small; white-space: normal;&quot;&gt;The handle_snmp_req is the snmp socket write completion handler, which responsible for writing to the SNMP socket. It will call snmp_sess_send API to send the SNMP request and call async_receive to let io::service know we are waiting for response, meaning we are ready for read.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: small; white-space: normal;&quot;&gt;is the snmp socket write completion handler, which responsible to writing to the SNMP socket.&lt;/span&gt;&lt;/span&gt;



&lt;pre&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;The handle_snmp_res is the SNMP socket read completion handler, which responsible for reading from the SNMP socket. It will call snmp_sess_read API to read the data from the response.&lt;/span&gt;&lt;/span&gt;

&lt;div&gt;
&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;i style=&quot;background-color: transparent;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: small;&quot;&gt;&lt;span style=&quot;line-height: 18px; white-space: normal;&quot;&gt;Step 3 - Grubbing the result adding&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;i style=&quot;background-color: transparent; text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;completion &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;i style=&quot;background-color: transparent;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: small;&quot;&gt;&lt;span style=&quot;line-height: 18px; white-space: normal;&quot;&gt;handle to async_snmp_get&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;pre style=&quot;background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;asynch_response(&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;operation,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;struct&lt;/span&gt;&amp;nbsp;snmp_session&amp;nbsp;*sp,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;reqid,
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;struct&lt;/span&gt;&amp;nbsp;snmp_pdu&amp;nbsp;*pdu,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;*magic)
{

&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(operation&amp;nbsp;==&amp;nbsp;NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;char&lt;/span&gt;&amp;nbsp;buf[1024];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(pdu-&amp;gt;errstat&amp;nbsp;==&amp;nbsp;SNMP_ERR_NOERROR)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;SNMP_ERR_NOERROR&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(pdu-&amp;gt;variables)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;//print_variable(pdu-&amp;gt;variables-&amp;gt;name,&amp;nbsp;pdu-&amp;gt;variables-&amp;gt;name_length,&amp;nbsp;&amp;nbsp;pdu-&amp;gt;variables);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snprint_variable(buf,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;sizeof&lt;/span&gt;(buf),&amp;nbsp;pdu-&amp;gt;variables-&amp;gt;name,&amp;nbsp;pdu-&amp;gt;variables-&amp;gt;name_length,&amp;nbsp;pdu-&amp;gt;variables);
&lt;span style=&quot;color: green;&quot;&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_connection::response_&amp;nbsp;=&amp;nbsp;buf;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt;&amp;nbsp;1;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;pre style=&quot;font-size: medium;&quot;&gt;&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;pre style=&quot;background-position: initial initial; background-repeat: initial initial; font-family: Consolas;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_connection::handle_snmp_res(&lt;span style=&quot;color: blue;&quot;&gt;const&lt;/span&gt;&amp;nbsp;boost::system::error_code&amp;nbsp;&amp;amp;ec,&amp;nbsp;std::size_t&amp;nbsp;bytes_transferred,&amp;nbsp;
         &amp;nbsp;&amp;nbsp;SNMPHandler&amp;nbsp;handler)&amp;nbsp;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;snmp_socket_.is_open())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(ec)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;error&amp;nbsp;snmp_connection::handle_snmp_res&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd_set&amp;nbsp;snmp_fds;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_ZERO(&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(snmp_socket_.native(),&amp;nbsp;&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_sess_read(snmp_handle_,&amp;nbsp;&amp;amp;snmp_fds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handler(snmp_response);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;
&lt;pre style=&quot;background-position: initial initial; background-repeat: initial initial; font-family: Consolas;&quot;&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;typedef&lt;/span&gt;&amp;nbsp;boost::function&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;(string)&amp;gt;&amp;nbsp;SNMPHandler &lt;span style=&quot;white-space: normal;&quot;&gt;The async_snmp_get is the definition of our&amp;nbsp;SNMP&amp;nbsp;completion&amp;nbsp;handler, which will execute after getting the response. The function input type is string, which is the&amp;nbsp;SNMP&amp;nbsp;response and returns void. you can define this function as you like.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;the async_response is the net-snmp callback&amp;nbsp;function&amp;nbsp;to execute in the snmp_sess_read. we provided it when we called snmp_sess_open. In this callback the&amp;nbsp;SNMP&amp;nbsp;library&amp;nbsp;will provide us the&amp;nbsp;result in the pdu&amp;nbsp;parameter. now we can save it in static parameter snmp_response&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; white-space: normal;&quot;&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;Here I will show how to use the&amp;nbsp;wrapper&amp;nbsp;interface we created.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;pre style=&quot;font-size: medium;&quot;&gt;&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;pre style=&quot;font-family: Consolas;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&amp;nbsp;snmp_print(string&amp;nbsp;result,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;num){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;result&amp;nbsp;&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;result&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;num&amp;nbsp;&quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;num&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/pre&gt;
&lt;pre style=&quot;font-family: Consolas;&quot;&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;pre style=&quot;font-family: Consolas;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;&amp;nbsp;main&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boost::asio::io_service&amp;nbsp;io_service;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_connection&amp;nbsp;snmp_conn(io_service);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_conn.connect(SNMP_VERSION_2c,string(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;192.168.1.1&quot;&lt;/span&gt;),&amp;nbsp;string(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;public&quot;&lt;/span&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snmp_conn.async_snmp_get(string(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;.1.3.6.1.2.1.1.4.0&quot;&lt;/span&gt;),&amp;nbsp;boost::bind(snmp_print,_1,3));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;io_service.run();
}
&lt;/pre&gt;
&lt;/pre&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; white-space: normal;&quot;&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;First we provide our SNMP&amp;nbsp;completion&amp;nbsp;handler (&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 13px;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;snmp_print(string&amp;nbsp;result,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 13px;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;num). &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;You can see that our&amp;nbsp;completion&amp;nbsp;handle take more&amp;nbsp;parameter&amp;nbsp;then the SNMPHandler. we will use boost::bind to our additional parameter in our case int num is bind to 3. _1 - is a string place holder for the passing of the snmp_response. Second we call connect to connect to the remote SNMP server. And Third we call async_snmp_get with an OID and SNMP&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; white-space: normal;&quot;&gt;completion&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;handler. In our example the completion handler need to be from type&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;boost::function&amp;lt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;(string,...)&amp;gt;.&lt;/pre&gt;
&lt;pre style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Times New Roman&#39;; white-space: normal;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog-moshe.blogspot.com/feeds/7332287453294242086/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://blog-moshe.blogspot.com/2012/10/boost-asio-with-net-snmp.html#comment-form' title='1 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3140765825091878616/posts/default/7332287453294242086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3140765825091878616/posts/default/7332287453294242086'/><link rel='alternate' type='text/html' href='http://blog-moshe.blogspot.com/2012/10/boost-asio-with-net-snmp.html' title='Boost asio with Net-Snmp'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/13074761233492491159</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>