{"id":306,"date":"2008-12-05T15:58:31","date_gmt":"2008-12-05T21:58:31","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=306"},"modified":"2008-12-05T21:33:51","modified_gmt":"2008-12-06T03:33:51","slug":"sockets-en-c","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=306","title":{"rendered":"Sockets en C#"},"content":{"rendered":"<p>Despues de leer en el \u201cnuevo\u201d cofrad\u00eda, acerca de <a href=\"http:\/\/www.solarsockets.solar-opensource.com\/index.php\/Portada\">SolarSockets<\/a>que es una librer\u00eda para manejar conexiones TCP de forma sensilla y basada en clases o c\u00f3digo lineal, vi que efectivamente la programaci\u00f3n en esta librer\u00eda era demasiado f\u00e1cil para lo que respecta a C, sin embargo la clase en si misma no es una idea original, es el mismo mecanismo que usa C# para manejar conexiones TCP<\/p>\n<p>El video de uso de SolarSockets:<\/p>\n<p><object width=\"425\" height=\"344\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/DHt-yvt20cQ&#038;hl=es&#038;fs=1\"><\/param><param name=\"allowFullScreen\" value=\"true\"><\/param><param name=\"allowscriptaccess\" value=\"always\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/DHt-yvt20cQ&#038;hl=es&#038;fs=1\" type=\"application\/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"425\" height=\"344\"><\/embed><\/object><\/p>\n<p>En este articulo, escribo un c\u00f3digo similar al sugerido por SolarSockets ,en GNU\/Linux y ademas en Windows escribo un par de programas cliente \u2013 servidor, para un programa de chateo entre 2 puntos.<\/p>\n<p>El siguiente c\u00f3digo, imita al c\u00f3digo de SolarSockets<\/p>\n<p>using System;<br \/>\nusing System.Net.Sockets;<\/p>\n<p>\nnamespace sockets1<br \/>\n{<br \/>\n&nbsp;&nbsp; &nbsp;class Program<br \/>\n&nbsp;&nbsp; &nbsp;{<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void Main(string[]<br \/>\nargs)<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<\/p>\n<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br \/>\nTcpClient servidor;<br \/>\ntry<br \/>\n{<\/p>\n<p>\/\/ Creando conexion al servidor<br \/>\nservidor = new TcpClient(&#8220;www.google.com&#8221;, 80);<\/p>\n<p>}<br \/>\ncatch<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Fallo la conexion&#8221;);<br \/>\nConsole.ReadKey(true);<br \/>\nreturn;<br \/>\n}<\/p>\n<p>\/\/ Creando flujo de red y de el la lectura y escritura del mismo<br \/>\nNetworkStream flujodered = servidor.GetStream();<br \/>\nSystem.IO.StreamReader leerflujo = new<br \/>\nSystem.IO.StreamReader(flujodered);<br \/>\nSystem.IO.StreamWriter escribirflujo = new<br \/>\nSystem.IO.StreamWriter(flujodered);<\/p>\n<p>String datos = &#8220;&#8221;;<br \/>\ntry<br \/>\n{<\/p>\n<p>\/\/ Lee del flujo de datos, en este caso , leera lo que envie<br \/>\nwww.google.com y lo imprimira en pantalla<br \/>\n\/\/ para provochar que google envie algo, se envian 2 nuevas lineas y 2<br \/>\nretornos de carro &#8220;enters&#8221;<br \/>\n{<br \/>\n&nbsp;escribirflujo.WriteLine (&#8220;\\n\\r\\n\\r&#8221;);<br \/>\n&nbsp;escribirflujo.Flush();<br \/>\ndatos = leerflujo.ReadToEnd();<br \/>\nConsole.WriteLine(datos);<br \/>\n}<br \/>\n}<br \/>\ncatch<br \/>\n{<br \/>\nConsole.WriteLine(&#8220;Error al recibir el flujo de datos&#8221;);<br \/>\n}<\/p>\n<p>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;Console.ReadKey(true);<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br \/>\n&nbsp;&nbsp; &nbsp;}<br \/>\n}<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/socketsc\/socket1.jpg\" alt=\"Codigo para leer una peticion de Google\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/socketsc\/socket1.jpg\">Ver mas grande<\/a><\/p>\n<p>El siguiente ser\u00e1 un c\u00f3digo similar, pero que espera recibir conexiones.<\/p>\n<p>Se puede comprobar haciendo un telnet al puerto 5000 tcp<\/p>\n<p>using System;<br \/>\nusing System.Net.Sockets;<br \/>\nusing System.Net;<\/p>\n<p>namespace sockets2<br \/>\n{<br \/>\n&nbsp;&nbsp; &nbsp;class Program<br \/>\n&nbsp;&nbsp; &nbsp;{<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void Main(string[]<br \/>\nargs)<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br \/>\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TcpListener<br \/>\nescuchar = new TcpListener(IPAddress.Any,5000);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nescuchar.Start();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Socket cliente<br \/>\n= escuchar.AcceptSocket();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if<br \/>\n(cliente.Connected)<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; \/\/ Terminar si<br \/>\nla conexion falla<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else return;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NetworkStream<br \/>\nflujodered = new NetworkStream(cliente);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nSystem.IO.StreamWriter escribirflujo = new<br \/>\nSystem.IO.StreamWriter(flujodered);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nSystem.IO.StreamReader leerflujo = new<br \/>\nSystem.IO.StreamReader(flujodered);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; escribirflujo.WriteLine (&#8220;Saludos desde la red&#8221;);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; escribirflujo.Flush();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; Console.WriteLine (leerflujo.ReadLine());<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\ncatch(Exception e)<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nSystem.Console.ReadLine();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; }<br \/>\n} <\/p>\n<p>Ahora que la forma b\u00e1sica ha quedado clara de c\u00f3mo conectarse o recibir conexiones, voy a escribir un programa en Windows que haga un chat<\/p>\n<p>Para este programa, lo \u00fanico adicional, ser\u00e1 que le programare un hilo que se encargara de escuchar las conexiones, este hilo tiene un prop\u00f3sito, separa la ejecuci\u00f3n del programa principal mientras espera recibir datos, porque de no hacerlo as\u00ed, el programa se pasmar\u00eda, ya que se quedar\u00eda esperando la conexi\u00f3n y no atender\u00eda ni eventos, a la vista de quien lo usa, parecer\u00eda que el programa se congelo. As\u00ed que al separar esa parte del c\u00f3digo en un hilo, el hilo se queda esperando dato todo el tiempo y cuando los recibe, se los pasa por medio de variables est\u00e1ticas al c\u00f3digo principal<\/p>\n<p>El c\u00f3digo  y los programas est\u00e1n dentro del siguiente <a href=\"https:\/\/www.lastdragon.net\/misarchivos\/socketsc\/chattcp.zip\">ZIP<\/a>, un video de c\u00f3mo funciona a continuaci\u00f3n.<\/p>\n<p><object width=\"425\" height=\"344\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/LzJEjMf4GPU&#038;hl=es&#038;fs=1\"><\/param><param name=\"allowFullScreen\" value=\"true\"><\/param><param name=\"allowscriptaccess\" value=\"always\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/LzJEjMf4GPU&#038;hl=es&#038;fs=1\" type=\"application\/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"425\" height=\"344\"><\/embed><\/object><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Despues de leer en el \u201cnuevo\u201d cofrad\u00eda, acerca de SolarSocketsque es una librer\u00eda para manejar conexiones TCP de forma sensilla y basada en clases o c\u00f3digo lineal, vi que efectivamente la programaci\u00f3n en esta librer\u00eda era demasiado f\u00e1cil para lo que respecta a C, sin embargo la clase en si misma no es una idea&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-306","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=306"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/306\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}