<?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>Jose Solares &#187; RDT</title>
	<atom:link href="http://chema.solaresmaldonado.com/tag/rdt/feed" rel="self" type="application/rss+xml" />
	<link>http://chema.solaresmaldonado.com</link>
	<description>Dream as if you&#039;ll live forever, Live as if you&#039;ll die today.</description>
	<lastBuildDate>Tue, 06 Sep 2011 18:04:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Sample Code for RDT Server</title>
		<link>http://chema.solaresmaldonado.com/linux/14/sample-code-for-rdt-server/</link>
		<comments>http://chema.solaresmaldonado.com/linux/14/sample-code-for-rdt-server/#comments</comments>
		<pubDate>Thu, 02 Jun 2005 02:36:00 +0000</pubDate>
		<dc:creator>Jose Solares</dc:creator>
				<category><![CDATA[english]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[avaya]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[RDT]]></category>

		<guid isPermaLink="false">http://chema.solaresmaldonado.com/1/14/sample-code-for-rdt-server/</guid>
		<description><![CDATA[This is sample code implementating the RDT Protocol described before.]]></description>
			<content:encoded><![CDATA[<p>
<b>Note:</b>This code expects to be using sockets blocking I/O request, to use non blocking I/O we should use libevent or a similar solution (like threads), this is outside of the scope of this code. It also assumes that we already have the server listening on a port and that we have already accepted a client connection `cliente_socket`. <span class="caps">RCVBUFFER </span>is 256.<br />
<p>


<pre>
char buffer[RCVBUFFER + 2];
buffer[RCVBUFFER] = 0;
char response[] = {2,6,1,0,7,1,0,2,1,6,0x81};
int  message_size,i,j;
char counter = 0;

if (( message_size = recv(client_socket, buffer,
        RCVBUFFER, 0)) &lt; 0 )
   err_handler (&quot;recv() failed&quot;);

if ( message_size == 17 ) {
   if ( send(client_socket, response, 11, 0) != 11 )
      err_handler (&quot;send() failed&quot;);
} else {
   printf ( &quot;- %d - \n&quot;, message_size );
   err_handler (&quot;Protocol Error&quot;);
}

printf (&quot;Starting...\n&quot;);

for (;;) {
   if (( message_size = recv(client_socket, buffer,
         RCVBUFFER, 0)) &lt; 0 )
      err_handler (&quot;recv() failed&quot;);

   if (message_size &gt; 5 &amp;amp;&amp;amp; bufer[0] == -128)
      counter = buffer[3];
   i = (buffer[0] == -128)? 5 : 0;
   buffer[message_size + 1] = '\0';
   buffer[message_size] = '\n';

   //printf (&quot;Capturing %d bytes\n&quot;,message_size);
   fprintf (stderr, &quot;%s&quot;,&amp;amp;buffer[i]);
   //printf (&quot;Current Counter : %d\n&quot;,counter);

   if (message_size == 1) {
       if (buffer[0] == 0x50) {
          char respond[] = {0x51};
          if ( send (client_socket, respond, 1, 0) != 1)
          err_handler(&quot;send() failed&quot;);
      }
   } else {
      i = message_size - 1;
      if (buffer[i-2] == 0x20 &amp;amp;&amp;amp; buffer[i-1] == 0x0d &amp;amp;&amp;amp; 
          buffer[i] == 0x0a) {
         char respond[] = {0x40, 0x05, 0x01, ++counter, 0x81};
         if ( send (client_socket, respond, 5, 0) != 5 )
            err_handler(&quot;send() failed&quot;);
      }
   }
/* Do Something with the Data we received */
}
</pre>]]></content:encoded>
			<wfw:commentRss>http://chema.solaresmaldonado.com/linux/14/sample-code-for-rdt-server//feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codigo de Ejemplo para Servidor RDT</title>
		<link>http://chema.solaresmaldonado.com/linux/12/codigo-de-server-rdt/</link>
		<comments>http://chema.solaresmaldonado.com/linux/12/codigo-de-server-rdt/#comments</comments>
		<pubDate>Thu, 02 Jun 2005 01:30:00 +0000</pubDate>
		<dc:creator>Jose Solares</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[avaya]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[RDT]]></category>

		<guid isPermaLink="false">http://chema.solaresmaldonado.com/1/12/codigo-de-server-rdt/</guid>
		<description><![CDATA[Codigo de Ejemplo para una implementacion de un servidor con el protocolo RDT]]></description>
			<content:encoded><![CDATA[<strong>Nota:</strong>Este codigo esta hecho para usar blocking I/O de sockets, para utilizar non blocking I/O debemos utilizar libevent, eso esta fuera del ambito de este codigo. Y asume que ya tenemos al servidor &#8220;escuchando&#8221; en un puerto y que ya aceptamos la conexion de un cliente `cliente_socket`.<br />
<p>


<pre>
<code>
char buffer[RCVBUFFER + 2];
buffer[RCVBUFFER] = 0;
char response[] = {2,6,1,0,7,1,0,2,1,6,0x81};
int  message_size,i,j;
char counter = 0;

if (( message_size = recv(client_socket, buffer,
        RCVBUFFER, 0)) &amp;lt; 0 )
   err_handler (&quot;recv() failed&quot;);

if ( message_size == 17 ) {
   if ( send(client_socket, response, 11, 0) != 11 )
      err_handler (&quot;send() failed&quot;);
} else {
   printf ( &quot;- %d - \n&quot;, message_size );
   err_handler (&quot;Protocol Error&quot;);
}

printf (&quot;Starting...\n&quot;);

for (;;) {
   if (( message_size = recv(client_socket, buffer,
         RCVBUFFER, 0)) &amp;lt; 0 )
      err_handler (&quot;recv() failed&quot;);
   counter = ( buffer&amp;#91;0] &amp;#61;= -128
             &amp;amp;&amp;amp; message_size &amp;gt; 5 )? buffer&amp;#91;3] : counter;
   i = (buffer&amp;#91;0] &amp;#61;= -128)? 5 : 0;
   buffer[message_size + 1] = '\0';
   buffer[message_size] = '\n';

   //printf (&quot;Capturing %d bytes\n&quot;,message_size);
   fprintf (stderr, &quot;%s&quot;,&amp;amp;buffer&amp;#91;i]);
   //printf (&quot;Current Counter : %d\n&quot;,counter);

   if (message_size == 1) {
       if (buffer&amp;#91;0] &amp;#61;= 0x50) {
          char respond[] = {0x51};
          if ( send (client_socket, respond, 1, 0) != 1)
          err_handler(&quot;send() failed&quot;);
      }
   } else {
      i = message_size - 1;
      if (buffer[i-2] &amp;#61;= 0x20 &amp;amp;&amp;amp; buffer[i-1] &amp;#61;= 0x0d &amp;amp;&amp;amp;
          buffer[i] &amp;#61;= 0x0a) {
         char respond[] = {0x40, 0x05, 0x01, ++counter, 0x81};
         if ( send (client_socket, respond, 5, 0) != 5 )
            err_handler(&quot;send() failed&quot;);
      }
   }
/* Do Something with the Data we received */
}
</code>
</pre>]]></content:encoded>
			<wfw:commentRss>http://chema.solaresmaldonado.com/linux/12/codigo-de-server-rdt//feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Draft del Protocolo RDT</title>
		<link>http://chema.solaresmaldonado.com/linux/11/draft-del-protocolo-rdt/</link>
		<comments>http://chema.solaresmaldonado.com/linux/11/draft-del-protocolo-rdt/#comments</comments>
		<pubDate>Thu, 02 Jun 2005 01:21:00 +0000</pubDate>
		<dc:creator>Jose Solares</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[avaya]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[RDT]]></category>

		<guid isPermaLink="false">http://chema.solaresmaldonado.com/1/11/draft-del-protocolo-rdt/</guid>
		<description><![CDATA[Draft del Protocolo de Avaya RDT como es utilizado por RDTT (Reliable Data Transport Tool), hecho utilizando ingeneria reversa con ethereal y analizando los paquetes.]]></description>
			<content:encoded><![CDATA[<h2>Draft del Protocolo de Avaya <acronym title="Reliable Data Transport">RDT</acronym><br />
Como es utilizado en <acronym title="Reliable Data Transport Tool">RDTT</acronym></h2>

<p class="justify" style="text-align:justify">No encontre ninguna aplicaci&oacute;n en linux que pudiera utilizar para un proyecto en el trabajo, por lo que armado de ethereal y <acronym title="Reliable Data Transport Tool">RDTT</acronym> en Windows hize una <em>ingenieria reversa</em></p>

<p>Esta especificacion caracteriza a un Server de <acronym title="Reliable Data Transport">RDT</acronym> ver codigo de ejemplo <a href="http://chema.solaresmaldonado.com/index.php?id=12">aca</a> </p>

<p class="justify" style="text-align:justify">Para iniciar una conexion el cliente de <acronym title="Reliable Data Transport">RDT</acronym> nos envia un paquete de 17 bytes, para seguir recibiendo datos que el cliente nos enviara debemos responder con :</p>

<blockquote><p>byte response[] = {2, 6, 1, 0, 7, 1, 0, 2, 1, 6, 0&#215;81};</p></blockquote>

<p>Luego recibimos los datos:</p>

<blockquote><p>definimos un checksum que el cliente espera recibir de la siguiente manera :<br />
( buffer[ 0 ] = = -128 &#038;&amp; msize &gt; 5 )?buffer[ 3 ]:0;<br />
o<br />
( buffer[ 0 ] = = 0&#215;80 &#038;&amp; msize &gt; 5 )?buffer[ 3 ]:0;<br />
dependiendo del OS que utilicemos.</p></blockquote>

<blockquote><p><em>buffer es char * donde recibimos  la data con recv o read</em><br />
<em>msize es int donde tenemos la cantidad de bytes leidos</em></p></blockquote>

<blockquote><p>el checksum lo enviamos al cliente al recibir `200d0a` al final de un paquete utlizando una respuesta char[]<br />
{0&#215;40, 0&#215;05, 0&#215;01, ++checksum, 0&#215;81};</p></blockquote>

<blockquote><p><acronym title="Reliable Data Tranport">RDT</acronym> tiene algo similar al ping de <acronym title="Internet Relay Chat">IRC</acronym>, periodicamente nos envia un paquete de 1 byte con 0&#215;50, esperando que le enviemos un paquete de 1 byte con 0&#215;51</p></blockquote>

<p>Espero que les sirva esta informaci&oacute;n</p>]]></content:encoded>
			<wfw:commentRss>http://chema.solaresmaldonado.com/linux/11/draft-del-protocolo-rdt//feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

