<?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>C# Snippets</title>
	<atom:link href="http://csharp.hijodeblog.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://csharp.hijodeblog.com</link>
	<description>Otro blog más de Hijo de Blog</description>
	<lastBuildDate>Tue, 08 May 2012 11:00:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Cómo hacer un ping con C#</title>
		<link>http://csharp.hijodeblog.com/2012/05/08/como-hacer-un-ping-con-c/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2012/05/08/como-hacer-un-ping-con-c/#comments</comments>
		<pubDate>Tue, 08 May 2012 10:24:57 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[comprobar ip]]></category>
		<category><![CDATA[ping]]></category>
		<category><![CDATA[red]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=47</guid>
		<description><![CDATA[A veces es necesario ejecutar un ping desde código para ver si una máquina está viva y responde. Podremos hacerlo con el código siguiente: He adaptado el código de éste post. ¡Gracias a su autor! Espero que os sea de utilidad. ¡Happy coding!]]></description>
			<content:encoded><![CDATA[<p>A veces es necesario ejecutar un ping desde código para ver si una máquina está viva y responde. Podremos hacerlo con el código siguiente:</p>
<pre class="brush: cpp; title: ; notranslate">
/**
 * Comprueba una IP lanzando un ping
 */
private bool comprobarIP(string ip, int timeoutSegs)
{
	// Creamos el objeto base y lo configuramos
	Ping ping = new Ping();

	PingOptions opciones = new PingOptions();
	opciones.DontFragment = true;

	// Añadimos 32 bytes de datos
	string datos = &quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;;
	byte[] buffer = Encoding.ASCII.GetBytes(datos);

	try
	{
		// Lanzamos el ping y esperamos la respuesta
		PingReply respuesta = ping.Send(ip, timeoutSegs*1000, buffer, opciones);

		if (respuesta.Status == IPStatus.Success) return true;
		else return false;
	}
	catch(Exception ex)
	{
		// Algo ha pasado...
		return false;
	}
}
</pre>
<p>He adaptado el código de <a href="http://www.fryan0911.com/2009/06/c-how-to-ping-remote-computer.html">éste post</a>. ¡Gracias a su autor!</p>
<p>Espero que os sea de utilidad. ¡Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2012/05/08/como-hacer-un-ping-con-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Feliz año 2012 desde HijoDeBlog!</title>
		<link>http://csharp.hijodeblog.com/2012/01/02/feliz-ano-2012-desde-hijodeblog/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2012/01/02/feliz-ano-2012-desde-hijodeblog/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 11:18:42 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[hijodeblog]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=44</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<pre class="brush: cpp; title: ; notranslate">using System;

/// &lt;summary&gt;
/// ¡Feliz año 2012 desde HijoDeBlog!
/// &lt;/summary&gt;
public class Felicitacion
{
 /// &lt;summary&gt;
 /// Constructor de la felicitación
 /// &lt;/summary&gt;
 public Felicitacion()
 {
 System.Console.WriteLine(&quot;¡Feliz año 2012 desde HijoDeBlog!&quot;);
 }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2012/01/02/feliz-ano-2012-desde-hijodeblog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accediendo de forma segura a controles Windows Forms entre hebras</title>
		<link>http://csharp.hijodeblog.com/2011/10/31/accediendo-de-forma-segura-a-controles-windows-forms-entre-hebras/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/10/31/accediendo-de-forma-segura-a-controles-windows-forms-entre-hebras/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 14:55:59 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[excepción]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[hebras]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[solución de errores]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=38</guid>
		<description><![CDATA[Hemos creado una hebra, y en ella hemos escriot una línea tan sencilla como: Y entonces de repente salta ésta excepción: &#8220;Cross-thread operation not valid: Control &#8216;richTextBox&#8217; accessed from a thread other than the thread it was created on.&#8221; LA explicación es clara, hemos intentado acceder a un control desde fuera de la hebra que [...]]]></description>
			<content:encoded><![CDATA[<p>Hemos creado una hebra, y en ella hemos escriot una línea tan sencilla como:</p>
<pre class="brush: csharp; title: ; notranslate">
this.richTextBox.Text = &quot;¡Hola, mundo!\r\n&quot;;
</pre>
<p>Y entonces de repente salta ésta excepción:</p>
<p style="padding-left: 30px;"><span style="color: #ff0000;"><strong>&#8220;Cross-thread operation not valid: Control &#8216;richTextBox&#8217; accessed from a thread other than the thread it was created on.&#8221;</strong></span></p>
<p>LA explicación es clara, hemos intentado acceder a un control desde fuera de la hebra que lo creó. Para solucionarlo usaremos una de las más interesantes características de C#: los delegados. El código de la solución sería el siguiente:</p>
<pre class="brush: csharp; title: ; notranslate">

public class Formulario : Form
{
	// Declaramos el delegado
	delegate void SetTextCallback(string texto);

	// Constructor
	public Form1()
	{
		// Inicializamos los componentes del diseñador
		InitializeComponent();

		// Creamos y ejecutamos la hebra
		Thread hebra = new Thread(new new ThreadStart(this.funcionHebra));
		hebra.Start();
	}

	// Función de la hebra
	public void funcionHebra()
	{
		this.SetTex(&quot;¡Hola, mundo!\r\n&quot;);
	}

	// Método para hacer la llamada al control entre hebras de forma segura
	private void SetText(string texto)
	{
		if (this.richTextBox.InvokeRequired)
		{
			// Si viene desde la hebra invocamos al delegado con éste método
			SetTextCallback d = new SetTextCallback(SetText);
			this.Invoke(d, new object[] { texto });
		}
		else
		{
			// Si no, usamos el control directamente
			this.richTextBox.Text = texto;
		}
	}
}
</pre>
<p>Como vemos, con una función que compruebe el origen de la llamada y un delegado para acceder de forma segura a ése método, solucionaremos el problema.</p>
<p>¡Espero que os sea de utilidad! ¡Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/10/31/accediendo-de-forma-segura-a-controles-windows-forms-entre-hebras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aumentando la legibilidad del código fuente C#: Code Foldings</title>
		<link>http://csharp.hijodeblog.com/2011/09/21/aumentando-la-legibilidad-del-codigo-fuente-c-code-foldings/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/09/21/aumentando-la-legibilidad-del-codigo-fuente-c-code-foldings/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 08:24:31 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[code foldings]]></category>
		<category><![CDATA[código fuente]]></category>
		<category><![CDATA[legibilidad]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=34</guid>
		<description><![CDATA[Cuando el código fuente se hac muy grande es importante contar con herramientas que nos ayuden a aumentar la legibilidad del código. Una de ésas herramientas son los Code Foldings, la capacidad de &#8220;plegar&#8221; porciones del código fuente de manera que sólo se muestren cuando sea necesario. En Visual Studio ésto se hace con las [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando el código fuente se hac muy grande es importante contar con herramientas que nos ayuden a aumentar la legibilidad del código. Una de ésas herramientas son los Code Foldings, la capacidad de &#8220;plegar&#8221; porciones del código fuente de manera que sólo se muestren cuando sea necesario.</p>
<p>En Visual Studio ésto se hace con las siguientes etiquetas:</p>
<pre class="brush: csharp; title: ; notranslate">#region Método que estará plegado

public void MetodoPleado()
{
	// ...
}

#endregion</pre>
<p>Probadlo envuestro código, el cambio es radical, ya veréis <img src='http://csharp.hijodeblog.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Aumentando la legibilidad del código fuente C#: Code Foldings" class='wp-smiley' title="Aumentando la legibilidad del código fuente C#: Code Foldings" /> </p>
<p>¡Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/09/21/aumentando-la-legibilidad-del-codigo-fuente-c-code-foldings/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tortoise SVN: Resolviendo el error Working copy &#8216;xxx&#8217; locked</title>
		<link>http://csharp.hijodeblog.com/2011/09/20/tortoise-svn-resolviendo-el-error-working-copy-xxx-locked/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/09/20/tortoise-svn-resolviendo-el-error-working-copy-xxx-locked/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 10:49:53 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[svn]]></category>
		<category><![CDATA[suvbersion]]></category>
		<category><![CDATA[tortoise svn]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=32</guid>
		<description><![CDATA[Los errores de Subversion son un poco raros y a veces incomprensibles. A veces surge éste aleatorio error, no termino de entender muy bien por qué. Si alguno lo sabe agradeceré que me explique un poco más el motivo en los comentarios. Para resolverlo basta con lo siguiente: Exportar todo el directorio conflictivo (el que [...]]]></description>
			<content:encoded><![CDATA[<p>Los errores de Subversion son un poco raros y a veces incomprensibles. A veces surge éste aleatorio error, no termino de entender muy bien por qué. Si alguno lo sabe agradeceré que me explique un poco más el motivo en los comentarios.</p>
<p>Para resolverlo basta con lo siguiente:</p>
<ul>
<li>Exportar todo el directorio conflictivo (el que ha provocado el error) usando la función export de Tortoise (o arrastrando con el botón derecho del ratón el directorio a otra localización).</li>
<li>Ejecutar un SVN cleanup desde el menú contextual de Tortoise SVN.</li>
<li>Volver a hacer un SVN Update del repositorio.</li>
<li>Copiar de nuevo los datos que hemos exportado previamente y volver a hacer el SVN commit.</li>
</ul>
<p>Espero que os ayude como a mi me ha ayudado. ¡Happy coding!</p>
<p>NOTA: Post simultáneo eny.</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/09/20/tortoise-svn-resolviendo-el-error-working-copy-xxx-locked/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Controlando el código fuente con Subversion: Usando el repositorio SVN</title>
		<link>http://csharp.hijodeblog.com/2011/09/15/controlando-el-codigo-fuente-con-subversion-usando-el-repositorio-svn/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/09/15/controlando-el-codigo-fuente-con-subversion-usando-el-repositorio-svn/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 07:45:39 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=30</guid>
		<description><![CDATA[Tras instalar y configurar nuestro repositorio, vamos a empezar a añadir código fuente de una forma adecuada para que nuestro proyecto sea fácilmente mantenible independientemente de cuantos desarrolladores envíen código a él. Como hemos visto, habrá tres directorios en nuestro repositorio: trunk: Contendrá la versión en desarrollo actual de todos los proyectos que se deseen [...]]]></description>
			<content:encoded><![CDATA[<p>Tras instalar y configurar nuestro repositorio, vamos a empezar a añadir código fuente de una forma adecuada para que nuestro proyecto sea fácilmente mantenible independientemente de cuantos desarrolladores envíen código a él.</p>
<p>Como hemos visto, habrá tres directorios en nuestro repositorio:</p>
<ul>
<li><strong>trunk:</strong> Contendrá la versión en desarrollo actual de todos los proyectos que se deseen controlar.</li>
<li><strong>branches:</strong> Contendrá versiones alternativas de un directorio de la rama TRUNK para hacer desarrollos paralelos. Luego podrán mezclarse unos con otros con el comando MERGE.</li>
<li><strong>tags:</strong> Contendrá releases finales de cada proyecto, etiquetadas con su código de versión (1.0.0, etc).</li>
</ul>
<p>Una vez comprendido cómo se estructurará nuestro repositorio, basta con usar herramientas como <strong>Tortoise SVN</strong> o los clientes SVN integrados en nuestro IDE favorito (Eclipse y NetBeans cuentan con herramientas para ese efecto) para actualizar y enviar nuestro código fuente y ahorrarnos muchos quebraderos de cabeza en desarrollos con un equipo de varios programadores. E incluso para un único programador es de utilidad.</p>
<p>¡Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/09/15/controlando-el-codigo-fuente-con-subversion-usando-el-repositorio-svn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Controlando el código fuente con Subversion: Creando un repositorio SVN</title>
		<link>http://csharp.hijodeblog.com/2011/09/14/controlando-el-codigo-fuente-con-subversion-creando-un-repositorio-svn/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/09/14/controlando-el-codigo-fuente-con-subversion-creando-un-repositorio-svn/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 15:16:42 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=26</guid>
		<description><![CDATA[Todo desarrollo tiene que estar respaldado de un buen control de versiones. Hoy aprenderemos a usar Subversion para llevar ése control de versiones Empezaremos instalando Subversion en nuestro Ubuntu Server: Una vez instalado, crearemos nuestro repositorio base para todos nuestros proyectos: Importamos la estructura base de directorios de todo repositorio SVN. Los explicaremos a continuación: [...]]]></description>
			<content:encoded><![CDATA[<p>Todo desarrollo tiene que estar respaldado de un buen control de versiones. Hoy aprenderemos a usar Subversion para llevar ése control de versiones<br />
Empezaremos instalando Subversion en nuestro Ubuntu Server:</p>
<pre class="brush: java; title: ; notranslate">$&gt; sudo aptitude install subversion</pre>
<p>Una vez instalado, crearemos nuestro repositorio base para todos nuestros proyectos:</p>
<pre class="brush: java; title: ; notranslate">$&gt; sudo mkdir /var/lib/svn
$&gt; sudo chmod -R 0777 /var/lib/svn
$&gt; svnadmin create /var/lib/svn</pre>
<p>Importamos la estructura base de directorios de todo repositorio SVN. Los explicaremos a continuación:</p>
<pre class="brush: java; title: ; notranslate">$&gt; sudo svn mkdir --message=&quot;Creando directorios iniciales...&quot; \
	file:///var/lib/svn/ContaWeb/trunk \
	file:///var/lib/svn/ContaWeb/tags \
	file:///var/lib/svn/ContaWeb/branches</pre>
<p>Procederemos a configurar el repositorio recién creado a nuestro gusto:</p>
<pre class="brush: java; title: ; notranslate">$&gt; nano -w /var/lib/svn/conf/svnserve.conf
$&gt; nano -w /var/lib/svn/conf/passwd</pre>
<p>Una vez creado y configurado el repositorio, deberemos iniciar el servidor SVN con el comando siguiente:</p>
<pre class="brush: java; title: ; notranslate">$&gt; sudo svnserve -d -r /var/lib/svn</pre>
<p>Para que sea más práctico, podremos automatizar éste inicio del servidor SVN creando un script de inicio Linux, aunque no es necesario.</p>
<p>Y ya está <img src='http://csharp.hijodeblog.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Controlando el código fuente con Subversion: Creando un repositorio SVN" class='wp-smiley' title="Controlando el código fuente con Subversion: Creando un repositorio SVN" />  Podremos acceder al repositorio con la URL siguiente (cambiando la IP y el usuario por los datos correcto):</p>
<pre class="brush: java; title: ; notranslate">svn://usuario@192.168.1.2/var/lib/svn</pre>
<p>¡Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/09/14/controlando-el-codigo-fuente-con-subversion-creando-un-repositorio-svn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como ejecutar cualquier comando a través del Shell de Windows</title>
		<link>http://csharp.hijodeblog.com/2011/08/10/ejecutar-comandos-shell-windows/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/08/10/ejecutar-comandos-shell-windows/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 10:20:54 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[ejecutar comandos]]></category>
		<category><![CDATA[procesos]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=23</guid>
		<description><![CDATA[Con éste método estático podremos ejecutar cualquier comando a través del Shell de Windows y recoger su salida: ¡Espero que os saque de algún aprieto como a mi!]]></description>
			<content:encoded><![CDATA[<p>Con éste método estático podremos ejecutar cualquier comando a través del Shell de Windows y recoger su salida:</p>
<pre class="brush: csharp; title: ; notranslate">/**
 * Ejecuta un comando usando el shell de Windows
 */
private static string ejecutarComando(string comando)
{
	// Generamos la info de proceso
	System.Diagnostics.ProcessStartInfo procInfo =
		new System.Diagnostics.ProcessStartInfo(&quot;cmd&quot;, &quot;/c &quot; + comando);

	// Configuramos el proceso para que redirija la salida y no genere ventanas
	procInfo.RedirectStandardOutput = true;
	procInfo.UseShellExecute = false;
	procInfo.CreateNoWindow = true;

	// Creamos el proceso en si
	System.Diagnostics.Process proceso = new System.Diagnostics.Process();
	proceso.StartInfo = procInfo;

	// Lo iniciamos
	proceso.Start();

	// Retornamos la salida del comando
	return proceso.StandardOutput.ReadToEnd();
}</pre>
<p>¡Espero que os saque de algún aprieto como a mi!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/08/10/ejecutar-comandos-shell-windows/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sockets en .NET</title>
		<link>http://csharp.hijodeblog.com/2011/07/21/sockets-en-net/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/07/21/sockets-en-net/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 16:08:14 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[microsoft]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[envío]]></category>
		<category><![CDATA[protocolos]]></category>
		<category><![CDATA[recepción]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tcp]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=13</guid>
		<description><![CDATA[Uno de los componentes básicos de las aplicaciones de hoy en día son los sockets, que permiten enviar y recibir datos a través de redes TCP/IP, es decir, permiten que nuestra aplicación se comunique con el mundo que la rodea. Veremos cómo inicializar, finalizar y utilizar éstos importantísimos elementos: Inicializar un socket Para inicializar un [...]]]></description>
			<content:encoded><![CDATA[<p id="internal-source-marker_0.6173225133679807" dir="ltr">Uno de los componentes básicos de las aplicaciones de hoy en día son los sockets, que permiten enviar y recibir datos a través de redes TCP/IP, es decir, permiten que nuestra aplicación se comunique con el mundo que la rodea. Veremos cómo inicializar, finalizar y utilizar éstos importantísimos elementos:</p>
<h4 dir="ltr">Inicializar un socket</h4>
<p dir="ltr">Para inicializar un socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):</p>
<pre class="brush: csharp; title: ; notranslate">// Basta con crear el objeto especificando su configuración con las
// enumeraciones AddressFamily, SocketType y ProtocolType
Socket socket = new Socket
(
AddressFamily.InterNetwork,    // IPv4
SocketType.Stream,             // Basado en streams
ProtocolType.Tcp               // TCP
);</pre>
<h4 dir="ltr">Recibir datos del socket</h4>
<p dir="ltr">Para recibir datos del socket tendremos que asociar el socket a un puerto (detallaré cada elemento con los comentarios del código fuente):</p>
<pre class="brush: csharp; title: ; notranslate">// Determinamos el punto final al que llegarán las peticiones
// y nos ponemos a escuchar
socket.Bind(new IPEndPoint(IPAddress.Any, Int32.Parse(textBoxPuertoEscucha.Text)));
socket.Listen(5); // Número máximo de peticiones en cola</pre>
<p dir="ltr">Luego, para recibir en si, tendremos que usar un código como éste:</p>
<pre class="brush: csharp; title: ; notranslate">// Esperamos una conexión entrante
while (!socket.Poll(socket.ReceiveTimeout, SelectMode.SelectRead))
{
	// Aún no ha llegado, haremos lo que sea necesario aquí
	// ...
}

// Aceptamos la conexión
Socket cliente = socket.Accept();
if (cliente != null)
{
	// Recibimos datos
	try
	{
		int numLeidos = cliente.Receive(buffer, 0, 256, SocketFlags.None);
		recibido += ASCIIEncoding.ASCII.GetString(buffer, 0, numLeidos);
	}
	catch (Exception ee)
	{
		// Algo ha sucedido...
	}

	// Registramos lo recibido
	if (recibido != &quot;&quot;)
	{
		// Procesamos aquí lo recibido como sea necesario
		// ...
	}
}</pre>
<h4 dir="ltr">Enviar datos por el socket</h4>
<p dir="ltr">Para enviar datos por el socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):</p>
<pre class="brush: csharp; title: ; notranslate">// Creamos un socket de envío
Socket socketEnvio = new Socket
(
	AddressFamily.InterNetwork,
	SocketType.Stream,
	ProtocolType.Tcp
);

// Conectamos a una IP y un puerto concreto
IPAddress[] direcciones = Dns.GetHostEntry(&quot;SERVIDOR&quot;).AddressList;
IPAddress direccionRemota = null;

foreach (IPAddress d in direcciones)
{
	if (d.AddressFamily == AddressFamily.InterNetwork)
	{
		direccionRemota = d;
	}
}

socketEnvio.Connect(new IPEndPoint(direccionRemota, Int32.Parse(&quot;PUERTO&quot;)));

// Enviamos los datos
socketEnvio.Send(System.Text.Encoding.ASCII.GetBytes(paqueteAEnviar));

// Desconectamos
socketEnvio.Close();</pre>
<h4 dir="ltr">Finalizar un socket</h4>
<p dir="ltr">Para finalizar un socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):</p>
<pre class="brush: csharp; title: ; notranslate">// Desconectamos
socket.Close();</pre>
<h4 dir="ltr">Conclusión</h4>
<p dir="ltr">Hemos visto un componente muy importante que nos abre un mundo de posibilidades. Una pieza más para el puzzle que son nuestras aplicaciones <img src='http://csharp.hijodeblog.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Sockets en .NET" class='wp-smiley' title="Sockets en .NET" />  ¡Pronto más!</p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/07/21/sockets-en-net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Usando algo parecido al ClassPath en C#</title>
		<link>http://csharp.hijodeblog.com/2011/06/28/usando-algo-parecido-al-classpath-en-c/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://csharp.hijodeblog.com/2011/06/28/usando-algo-parecido-al-classpath-en-c/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 10:38:33 +0000</pubDate>
		<dc:creator>Dr. SeROne</dc:creator>
				<category><![CDATA[microsoft]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[classpath]]></category>
		<category><![CDATA[firma digital]]></category>
		<category><![CDATA[librerias comunes]]></category>
		<category><![CDATA[strong name]]></category>

		<guid isPermaLink="false">http://csharp.hijodeblog.com/?p=8</guid>
		<description><![CDATA[Para incluir y usar librerías que estén en rutas diferentes al binario de la aplicación (por ejemplo, un directorio de librerías común), deberemos hacer lo siguiente: Incluir en nuestro proyecto los ensamblados. En las propiedades de las referencias , especificar que NO se copiarán al directorio destino al compilar. La librería debe estar firmada con [...]]]></description>
			<content:encoded><![CDATA[<p dir="ltr">Para incluir y usar librerías que estén en rutas diferentes al binario de la aplicación (por ejemplo, un directorio de librerías común), deberemos hacer lo siguiente:</p>
<ul>
<li>
<p dir="ltr">Incluir en nuestro proyecto los ensamblados. En las propiedades de las referencias , especificar que NO se copiarán al directorio destino al compilar.</p>
</li>
</ul>
<ul>
<li>
<p dir="ltr">La librería debe estar firmada con un Strong Name. Si no lo está, lo añadiremos y recompilaremos la librería.</p>
</li>
</ul>
<ul>
<li>
<p dir="ltr">Obtener el Public Token de la librería a importar con el comando siguiente (el comando viene con una instalación normal del SDK de Windows):</p>
</li>
</ul>
<p style="padding-left: 60px"><span style="color: #0000ff">&#8220;C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\bin\sn.exe&#8221; -T C:\Lib\MiLibreria.dll</span></p>
<ul>
<li>
<p dir="ltr">Obtener también la versión del ensamblado.</p>
</li>
</ul>
<ul>
<li>
<p dir="ltr">Agregar con el asistente de ‘Nuevo Archivo’ un ‘Archivo de configuración’ al proyecto, de nombre ‘App.config’. Dentro de el anotar lo siguiente (cambiando por la versión y el Public Token obtenidos antes:</p>
</li>
</ul>
<p style="padding-left: 60px" dir="ltr"><span style="color: #0000ff">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;</span></p>
<p style="padding-left: 60px" dir="ltr"><span style="color: #0000ff">&lt;configuration&gt;</span></p>
<p style="padding-left: 90px" dir="ltr"><span style="color: #0000ff">&lt;runtime&gt;</span></p>
<p style="padding-left: 120px" dir="ltr"><span style="color: #0000ff">&lt;assemblyBinding xmlns=&#8221;urn:schemas-microsoft-com:asm.v1&#8243;&gt;</span></p>
<p style="padding-left: 150px" dir="ltr"><span style="color: #0000ff">&lt;dependentAssembly&gt;</span></p>
<p style="padding-left: 180px" dir="ltr"><span style="color: #0000ff">&lt;assemblyIdentity name=&#8221;MiLibreria&#8221; culture=&#8221;neutral&#8221; </span><span style="color: #0000ff">publicKeyToken=&#8221;1a7ca47513ea9b60&#8243; /&gt;</span></p>
<p style="padding-left: 180px" dir="ltr"><span style="color: #0000ff">&lt;codeBase version=&#8221;0.2.1.21660&#8243; </span><span style="color: #0000ff">href=&#8221;FILE://C:/Lib/MiLibreria.dll&#8221;/&gt;</span></p>
<p style="padding-left: 150px" dir="ltr"><span style="color: #0000ff">&lt;/dependentAssembly&gt;</span></p>
<p style="padding-left: 120px" dir="ltr"><span style="color: #0000ff">&lt;/assemblyBinding&gt;</span></p>
<p style="padding-left: 90px" dir="ltr"><span style="color: #0000ff">&lt;/runtime&gt;</span></p>
<p style="padding-left: 60px" dir="ltr"><span style="color: #0000ff">&lt;/configuration&gt;</span></p>
<ul>
<li>
<p dir="ltr">Repetir éste proceso por cada librería necesaria, añadiéndola al App.config con su configuración correcta.</p>
</li>
</ul>
<ul>
<li>
<p dir="ltr">Compilar la aplicación y ejecutar de forma normal.</p>
</li>
</ul>
<p>Si deseas saber más, consulta <a href="http://support.microsoft.com/kb/837908">http://support.microsoft.com/kb/837908</a>.</p>
<p>Y recordad, <strong>Code is Poetry</strong> <img src='http://csharp.hijodeblog.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile Usando algo parecido al ClassPath en C#" class='wp-smiley' title="Usando algo parecido al ClassPath en C#" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://csharp.hijodeblog.com/2011/06/28/usando-algo-parecido-al-classpath-en-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
