<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Del&#039;Arco &#187; resolver</title>
	<atom:link href="http://blog.delarco.com.br/tag/resolver/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.delarco.com.br</link>
	<description>The Pixel Company</description>
	<lastBuildDate>Mon, 07 Jun 2010 18:35:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>boost::asio &#8211; Introdução</title>
		<link>http://blog.delarco.com.br/boostasio-introducao/</link>
		<comments>http://blog.delarco.com.br/boostasio-introducao/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 19:49:26 +0000</pubDate>
		<dc:creator>Leandro Del&#39;Arco</dc:creator>
				<category><![CDATA[Boost]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[asio]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[resolver]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[synchronous]]></category>
		<category><![CDATA[timer]]></category>

		<guid isPermaLink="false">http://blog.delarco.com.br/?p=139</guid>
		<description><![CDATA[Apesar de pouco comentado (pelo menos nos forums que eu participo participava), Boost é um conjunto de bibliotecas que facilitam muito a vida do programador e , sem dúvidas, é o plus-plus do C++. Se vc ainda não conhece: http://www.boost.org/.
Para quem não sabe, Boost.Asio é uma biblioteca multiplataforma (cross-platform) para programação de rede/comunicação (network) e [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-197" src="http://blog.delarco.com.br/wp-content/uploads/2009/11/boost.png" alt="boost" width="277" height="86" />Apesar de pouco comentado (pelo menos nos forums que eu <span style="text-decoration: line-through">participo</span> participava), Boost é um conjunto de bibliotecas que facilitam <strong>muito </strong>a vida do programador e , sem dúvidas, é o <em>plus-plus</em> do C++. Se vc ainda não conhece: <a href="http://www.boost.org/" target="_blank">http://www.boost.org/</a>.</p>
<p>Para quem não sabe, Boost.Asio é uma biblioteca multiplataforma (<em>cross-platform</em>) para programação de rede/comunicação (<em>network</em>) e operações de entrada e saída em baixo nível (<em>low-level I/O</em>) que oferece, aos desenvolvedores, um modelo consistente e assíncrono.</p>
<p><em>(Essa definição foi descaradamente traduzida da encontrada no <a href="http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio.html" target="_blank">site oficial</a>)</em></p>
<blockquote><p>Então, o que eu posso fazer com isso?</p></blockquote>
<p>Você pode, por exemplo, usar sockets (TCP, UDP e ICMP), Timers e criar/manipular portas seriais.</p>
<blockquote><p>Mas eu sei fazer isso! É só incluir o winsock.h e&#8230; no linux é fácil tb&#8230;</p></blockquote>
<p>Não ter que se preocupar com o startup e cleanup do Winsock e não ter que colocar 8463763 <em>#ifdef</em>&#8217;s no meio do código já é um bom motivo para usar Boost.Asio. Se vc escrever &#8220;<em>socket.read_some(&#8230;);</em>&#8220;, vai funcionar em qualquer plataforma suportada (Win32/64, Linux kernel 2.4+, Solaris, Mac OS X 10.4+).</p>
<blockquote><p>Beleza! Cadê os exemplos?</p></blockquote>
<p>Antes disso, para não ficar perdido, é necessário entender como o Boost.Asio trabalha. Ao inves de oferecer um modelo genérico aproximado ao que há de comum entre as várias plataformas, a biblioteca apresenta uma nova proposta: para efetuar operações de entrada e saída seu programa precisa de, no mínimo, um objeto io_service (boost::asio::io_service). O objeto io_service funciona como um intermediário entre o seu software e o sistema operacional. Overhead? Tenha certeza que o boost faz esse intermédio da forma mais eficiente possível e, até hoje, nunca vi ninguém reclamando sobre o desempenho da biblioteca. A imagem abaixo (que foi retirada do site oficial) mostra o funcionamento do Boost.Asio para operações síncrona:</p>
<p><img class="size-full wp-image-198 alignleft" src="http://blog.delarco.com.br/wp-content/uploads/2009/11/sync_op.png" alt="sync_op" width="232" height="413" />1 &#8211; O programa inicia a conexão chamando o objeto i/o (socket, por exemplo);</p>
<p>2 &#8211; O objeto i/o encaminha a requisição de conexão para o objeto io_service;</p>
<p>3 &#8211; O objeto io_service faz uma chamada ao sistema operacional para realizar a conexão;</p>
<p>4 &#8211; O sistema operacional retorna um resultado para o objeto io_service;</p>
<p>5 &#8211; O objeto io_service &#8220;traduz&#8221; qualquer erro resultante na operação e retorna ao objeto i/o;</p>
<p>6 &#8211; O objeto i/o retorna o resultado para o programa.</p>
<p><span style="color: #ffffff">.</span></p>
<p><span style="color: #ffffff">.</span></p>
<p><span style="color: #ffffff">.</span></p>
<p><span style="color: #ffffff">.</span></p>
<p><span style="color: #ffffff">.</span></p>
<p>O modelo para operações assíncronas é representado pelo diagrama ao lado: <img class="alignright size-full wp-image-199" src="http://blog.delarco.com.br/wp-content/uploads/2009/11/async_op.png" alt="async_op" width="377" height="413" /></p>
<p>Ao invés de esperar cada etapa do modelo síncrono, aqui podemos passar uma função <em>handler</em> que será chamada assim que a operação for concluída, independente da ocorrência de erros.</p>
<p>As três primeiras etapas são praticamente idênticas ao modelo anterior (do ponto de vista do usuário/programador):</p>
<p>1 &#8211; O programa inicia a conexão chamando o objeto i/o (socket, por exemplo);</p>
<p>2 &#8211; O objeto i/o encaminha a requisição de conexão para o objeto io_service;</p>
<p>3 &#8211; O objeto io_service faz uma chamada ao sistema operacional para realizar a conexão;</p>
<p>Após as etapas indicadas, o sistema operacional indica o resultado da operação colocando-o em uma fila que será lida pelo objeto io_service, que por sua vez &#8220;traduz&#8221; qualquer mensagem de erro e chama a função <em>handler</em> passada como parâmetro pelo programa.</p>
<p>É importante comentar que, para que o objeto io_service possa tratar as tarefas/operações assíncronas pendentes, é necessário chamar <strong>io_service::run()</strong>.</p>
<p>A função <strong>io_service::run()</strong> retornará assim que não houver mais tarefa assíncronas pendentes.</p>
<blockquote><p>Okay! Então eu crio um objeto io_service e já era?</p></blockquote>
<p><strong>Aí é que está a grande maravilha do modelo proposto:</strong> usando vários objetos io_service (um em cada thread) e dividindo as operações entre eles, permitimos ao sistema operacional também dividí-las entre os vários núcleo disponíveis!</p>
<blockquote><p>Tá&#8230; e os exemplos?</p></blockquote>
<h2>Timer</h2>
<p>Para um <em>wait </em>síncrono (só retorna depois de completo):</p>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::io_service;
using boost::asio::deadline_timer;

int main(int ac, char ** av)
{
    io_service ios;

    deadline_timer t(ios);
    t.expires_from_now(boost::posix_time::seconds(5));

    std::cout &lt;&lt; &quot;Esperando 5 segundos...&quot; &lt;&lt; std::endl;

    t.wait();

    std::cout &lt;&lt; &quot;Continua...&quot; &lt;&lt; std::endl;
    return 0;
}
</pre>
<p>Para um timer assíncrono, precisamos de um <em>handler</em>:</p>
<pre class="brush: cpp;">

void handler(boost::system::error_code &amp; ec)
{
	if(ec)
		//erro
	else
		//ok
}
</pre>
<p><span>Então, podemos usar o <em>wait </em>assíncrono:</span></p>
<p><span>
<pre class="brush: cpp;">
t.expires_from_now(boost::posix_time::milliseconds(400));
t.async_wait(handler);
ios.run();
</pre>
<p></span></p>
<p>Um exemplo de timer assíncrono:</p>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;boost/asio.hpp&gt;
#include &lt;boost/bind.hpp&gt;

using boost::asio::io_service;
using boost::asio::deadline_timer;

void handler(int segundo, boost::system::error_code &amp; ec)
{
	if(!ec)
		std::cout &lt;&lt; &quot;Esperando... &quot; &lt;&lt; segundo &lt;&lt; std::endl;
}

int main(int ac, char ** av)
{
	io_service ios;

	for(int i = 1; i &lt;= 5; i++)
	{
		deadline_timer * t = new deadline_timer(ios);
		t-&gt;expires_from_now(boost::posix_time::seconds(i));
		t-&gt;async_wait(boost::bind(&amp;handler, i, boost::asio::placeholders::error));
	}

	ios.run();

	std::cout &lt;&lt; &quot;Continua...&quot; &lt;&lt; std::endl;
	return 0;
}
</pre>
<p>Repare que não me preocupei em manter uma referência para os objetos criados dinamicamente (para apagá-los posteriormente), pois o programa é terminado logo após o retorno do último timer assíncrono.</p>
<h2>Socket</h2>
<p>Um exemplo simples de socket (tcp) que se conecta ao site:</p>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::io_service;
using boost::asio::ip::tcp;

int main(int ac, char ** av)
{
    io_service ios;

    tcp::socket sck(ios);
    tcp::endpoint endp(boost::asio::ip::address::from_string(&quot;64.191.3.101&quot;), 80);

    try
    {
        sck.connect(endp);
        std::cout &lt;&lt; &quot;Conectado!&quot; &lt;&lt; std::endl;
    }
    catch(boost::system::system_error &amp; error)
    {
        std::cout &lt;&lt; &quot;Erro ao conectar: &quot; &lt;&lt; error.what() &lt;&lt; std::endl;
    }

    std::cout &lt;&lt; &quot;Continua...&quot; &lt;&lt; std::endl;
    return 0;
}
</pre>
<p>Ou um resolver:</p>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;boost/asio.hpp&gt;

using boost::asio::io_service;
using boost::asio::ip::tcp;

int main(int ac, char ** av)
{
    io_service ios;

    tcp::resolver resolver(ios);
    tcp::resolver::query query(&quot;blog.delarco.com.br&quot;, &quot;http&quot;);
    tcp::resolver::iterator iter = resolver.resolve(query);
    tcp::resolver::iterator end;

    while (iter != end)
    {
        tcp::endpoint endpoint = *iter++;
        std::cout &lt;&lt; endpoint &lt;&lt; std::endl;
    }

    return 0;
}
</pre>
<div style="overflow: hidden;width: 1px;height: 1px">#include &lt;iostream&gt;<br />
#include &lt;boost/asio.hpp&gt;using boost::asio::io_service;<br />
using boost::asio::deadline_timer;int main(int ac, char ** av)<br />
{<br />
io_service ios;</p>
<p>deadline_timer t(ios);<br />
t.expires_from_now(boost::posix_time::seconds(5));</p>
<p>std::cout &lt;&lt; &#8220;Esperando 5 segundos&#8230;&#8221; &lt;&lt; std::endl;</p>
<p>t.wait();</p>
<p>std::cout &lt;&lt; &#8220;Continua&#8230;&#8221; &lt;&lt; std::endl;</p>
<p>return 0;<br />
}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.delarco.com.br/boostasio-introducao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
