Komoloves

Todo lo que pueda ser interesante, de entretenimiento con curiosidades y siguiendo la Actualidad y las noticias
  • Home
  • Historico
  • Enlaces
  • Contacto
Jun 9, 2008

Clase TCPClient con Socket IOException solved

Artículo de Programación .Net (C# ) Clase TCPClient.

El objetivo del siguiente artículo es explicar porque es lanzada la excepcion IOException Unable to read data from the transport connection An existing connection was forcibly closed by the remote host desde la Clase TCPClient.

Lo explico debido a que estuve buscando información en diferentes webs y foros sin éxito, encontrando diversos problemas, pero no encontraba la solución ni tampoco encontraba el porque, a un problema en particular que tenía en relación a esta excepción que saltaba a veces.

Al final, debuggando y con logs, he podido dar con la solución. Y lo más importante es saber el porque daba saltaba la excepción desde el Socket Cliente (TCPClient) al hacer un Read().
Así que IOException Unable to read data from the transport connection An existing connection was forcibly closed by the remote host esta solucionado.

Ejemplo gráfico de envío y recepción sin problemas

1.- Utilizamos un Client Send común para enviar todas las peticiones, por lo que realizamos el “Send” y después el “Read and Wait response”, por lo que este canal se bloquea esperando la respuesta. Una vez recibimos la respuesta, continuamos la ejecución sin ningún problema.

Ejemplo gráfico de envío y recepción saltando la exception

” Unable to read data from the transport connection An existing connection was forcibly closed by the remote host “
2.- Seguimos los pasos del anterior ejemplo, la diferencia es que después de realizar el “Send” y el “Read and Wait response”, durante esperamos la respuesta, ya que en ocasiones podría tardar más de lo que creemos, desde otro hilo en particulas se puede realizar otra petición que realiza un “Send” y justo cuando se prepara para el “Read and Wait response” saltará la excepción.
¡¡¡ Justo en este momento saltará la excepción del primer Read(), diciendo que no puede leer !!!

El Problema

El Problema existe cuando se utiliza un único Socket Client, compartido entre diferentes hilos o procesos pueden llegar a utilizarlo, sin su debido control para la concurrencia. No es que se estuviera utilizando de forma incorrecta el TCPClient, simplemente era un tema de colisión entre diferentes procesos accediendo al mismo canal de comunicación.

Solución

Según el caso puede variar, en función de las necesidades de cada proyecto.
1.- Cada vez que se realiza el Send, en el mismo método crear un TCPClient diferente
que realiza el Send, Read and Wait y Close and null.
2.- Crear un TCPClient para cada Hilo diferente que necesite enviar peticiones. Por lo que la colisión no existiría.
3.- Secciones criticas, y controlar el acceso concurrente.
4.- …

Gracias, y espero que sea de ayuda.

porkeno
.Net c#, Programacion, Tecnologia
21 Comentarios »
21 Comentarios en “Clase TCPClient con Socket IOException solved”
  1. 22 Jul 2008 at 22:371Melisa

    hola, pues que bien tu analisis, pero tengo otra duda yo me conecto con una pda y el puerto que uso para enviar es el 1500 y me conecto a ese mismo para recibir, pero si creo tcpclient para cada pda??? no se como aplicaria en mi caso

    Using Mozilla Firefox Mozilla Firefox 3.0 on Windows Windows XP
  2. 23 Jul 2008 at 8:272porkeno

    @melisa, Según entiendo la pda tiene que tener un tcpclient que se conecta al puerto 1500 que tendrá un tcpserver. en principio puedes tener varias pdas conectadas al puerto 1500, es el tcpserver quien por cada conexión debe ofrecer una contestación. No te entiendo muy bien, cual es el problema, o si simplemente es una duda, pero podrías poder conectarte con diferentes clientes (pda con tcpclient) a un mismo servidor que este escuchando por el puerto 1500. Es el servidor quien debería ofrecer servicio a todos los clientes correctamente. ¿Cual es tu problema? ¿te salta la excepción? y si es así ¿donde? ¿en el lado del cliente o el lado del servidor?

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  3. 24 Jul 2008 at 0:523Melisa

    hola… mira resulta que yo me conecto a una pc que es el servidor y ella tiene el TcpServer yo pienso puesto que tiene instalado el openfire… entonces yo conecto una pda al puerto 1500 y dejo la informacion, para que la lea la otra pda que conecte tambien al puerto 1500…y la pda que deja la informacion hace todo bien y se desconecta…pero la que debe leer, al momento de hacer el “read()” me salta la exception…

    TcpClient tc = new TcpClient(host, 1500);
    NetworkStream ns = tc.GetStream();
    FileInfo file = new FileInfo(fn);
    FileStream fs = new FileStream(file.Name, FileMode.Create, FileAccess.Write);
    BinaryWriter stream = new BinaryWriter(fs);
    BinaryReader r = new BinaryReader(ns);
    byte[] buffer = new byte[1024];
    int bytesRead;
    while((bytesRead = r.Read(buffer, 0, buffer.Length))!= 0)
    {
    stream.Write(buffer, 0, bytesRead);
    }

    Using Mozilla Firefox Mozilla Firefox 3.0 on Windows Windows XP
  4. 24 Jul 2008 at 8:484porkeno

    @Melinda, intentaré contestarte esta tarde cuando llegue a casa.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  5. 24 Jul 2008 at 18:525porkeno

    @Melinda, Yo tengo una clase llamada SocketManager y luego otra Clase Client y otra Clase Server, La cual cada una encapsula a los objetos TCPClient y TCPListener.

    Te paso un link que enlaza a un clase que contiene lo relacionado con la parte del TCPClient o la comunicación del Socket desde el lado del cliente. De esta manera podrás ver como lo tengo echo. Si hay algo que no entiendes me dices, pero estoy seguro que puedes encontrar ayuda en el MSDN de Microsoft, pero lo dicho si quieres comentarme algo aquí estamos.

    SocketManagerClient

    En definitiva la clase contiene un
    - ClientManager // Quien nos abstrae de la complejidad de los sockets.
    - Client // Crea el TCPClient, Envia y gestiona la contestación desde el Server
    - MyListen // Quien recibe la información y se la pasa al Client

    En Resumen, Cada vez que se envia se crea un TCPClient, y se envia la información, justo en ese momento nos esperamos a la respuesta (MyListen). Al finalizar se libera el Client. Hasta que no se recibe la respuesta el flujo de enviar no acaba. Como cada vez que se envia se crea un nuevo TCPClient no hay problema de que se solape información y que salte la excepción.

    Ya me dirás Algo.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  6. 24 Jul 2008 at 19:356Melisa

    gracias!!! creo que ya quedo ya quedo

    Using Mozilla Firefox Mozilla Firefox 3.0 on Windows Windows XP
  7. 25 Jul 2008 at 8:057porkeno

    @Melisa, pues en principio ya esta, Me imagino que he podido ayudarte, así que me alegro mucho. Saludos.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  8. 29 Jul 2008 at 23:128Mary

    hola…veo que tenia problemas con el molesto error “IOException: unable to read data from transported connection.–>System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host”..y yo tambien lo tengo.
    resulta que yo estoy transfiriendo informacion de una pda a otra, a las dos las conecto a un servidor openfire, atravez del tcpclient cambie mi puerto de conexion al 1500, como Melisa…la pda que envia el archivo termina su proceso normalmente…pero la que recibe me bota la ioexception, entonces sabe alguno como puedo verificar si el openfire es el que esta haciendo las cosas mal….que clase es la que debo revisar????
    gracias

    Using Internet Explorer Internet Explorer 7.0 on Windows Windows XP
  9. 30 Jul 2008 at 8:149porkeno

    @Mary, a Melissa le puse un código en el comentario #5, en principio le ha ido bien. Así es como, mas o menos, tengo el TCPClient programado y me funciona. échale un vistazo y mira a ver si te sirve, parece que Melissa tenía el mismo problema o uno similar a ti, así que quizás te funcione.
    Saludos.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  10. 30 Jul 2008 at 20:5610Mary

    hola, estoy revisando el codigo…i surge una pregunta de que libreria sale el OnReceivedData, System.net.sockets?… es que no lo reconoce

    Using Internet Explorer Internet Explorer 7.0 on Windows Windows XP
  11. 30 Jul 2008 at 21:1711Mary

    que framework necesito tener???

    Using Internet Explorer Internet Explorer 7.0 on Windows Windows XP
  12. 31 Jul 2008 at 8:2812porkeno

    @Mary, El framework que se utiliza es el 2.0, pero el OnReceivedData es un delegado que se crea, para después publicar el evento. Me parece que tuve un descuido, ya que modifique el nombre del delegado. Prueba de poner “OnClientReceivedData” en lugar del otro. Este delegado si que lo tienes declarado.
    Si te va por favor avísame que me dará mucha ilusión.
    Saludos y Gracias.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  13. 01 Ago 2008 at 19:2613Mary

    hola…oye pues si se arreglo el problema…pero tengo una pregunta mas….como es la transferencia de los datos???…el tcpclien se conecta al dispositivo que envia, o se hace atraves del puerto del servidor…donde ambas pda’s se conectan al mismo puerto y una deja la info y la otra la recoge???

    Using Mozilla Firefox Mozilla Firefox 3.0.1 on Windows Windows XP
  14. 01 Ago 2008 at 20:3514porkeno

    @Mary, realmente depende de como trate el server a los clientes que se les conecta. Lo habitual es que el Server este escuchando por el puerto 1500 (en este caso), pero para cada cliente este abre un canal propio en otro puerto que asigna automáticamente. Dos clientes no podrán transferir nunca por el mismo canal, así que deberá asignar un canal para cada uno o sino realizar un control mediante secciones críticas o semáforos para evitar colisiones.

    No se muy bien como funciona lo que estáis haciendo de las Pda’s, pero me imagino que una pda (cliente) envía un mensaje o petición (en definitiva són datos), y el server en función de lo que recibe te devuelve una contestación acorde a los datos recibidos por el cliente. Es posible que un cliente actualice información en el server, y una vez estén actualizados, el server pueda proporcionar dicha información al resto de clientes que la soliciten.

    Espero haberte ayudado. Saludos.

    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP
  15. 01 Ago 2008 at 21:5215Mary

    aahhh ok ahora entiendo…si eso es lo que me provocaba conflicto…bueno creo que con esto ya queda …gracias de verdad por tu tiempo y ayuda.

    (desde Mexico) Mary

    Using Mozilla Firefox Mozilla Firefox 3.0.1 on Windows Windows XP
  16. 24 Mar 2009 at 15:1116Anny

    Hola. No se si podran ayudarme, pero espero que si. Mi caso es el siguiente:
    Tengo un servidor con una aplicacion publicada la cual debo accesar atravez de unas pdas que se conectan al internet (cada pda que tengo tiene un servicio de datos para navegar en internet) esta deberia de conectarse a la aplicacion para enviar y recibir informacion de la misma. El problema es que la pda se conecta con el servidor y recibe informacion de el mismo, pero a la hora de enviarle datos al servidor da el siguiente error:” Unable to read data from the transport connection “, lo raro es que cuando conecto la pda a otra pc para usar el internet de la pc en algunos casos logra enviar los datos.

    Espero que entiendan y puedan resolver mi situacion.

    Using Internet Explorer Internet Explorer 7.0 on Windows Windows Server 2003
  17. 25 Mar 2009 at 20:0517porkeno

    @Anny, perdona por no contestarte antes, pero en el comentario nº 5 podrás descargarte unos archivos, podrás ver si te funcionan o no. Seguramente lo que te pasa es lo que se describe en el Ejemplo. Mi suposición es que estas reutilizando la misma clase cliente para cada envío de datos sin ninguna sección crítica. Podría ser que en algunos casos funcione y que en otros, la casualidad te lleva a la excepción.

    Seguramente diferentes peticiones están utilizando la misma clase cliente, mientras uno envía y espera la respuesta, a la misma vez otro envía e intenta esperar la respuesta. Si la clase Client ya tiene un Read (escuchando), es normal que al intentar hacer otro Read por el mismo Socket te salte la excepción. (no puede leer dos respuestas diferentes por el mismo socket).

    Espero haberte ayudado. Si es así, te agradecería que me dejaras un comentario, me gustaría saberlo. Saludos.

    Using Mozilla Firefox Mozilla Firefox 3.0.7 on Windows Windows Vista
  18. 03 Abr 2009 at 3:5818Mely

    hola, disculpa por no contestarte antes…pues estas en buenas manos, aqui porkeno es el maestro el me ayudo a resolver mi problema
    salu2s

    Using Mozilla Firefox Mozilla Firefox 3.0.8 on Windows Windows XP
  19. 03 Abr 2009 at 7:1719porkeno

    Gracias a Ti

    Using Mozilla Firefox Mozilla Firefox 3.0.8 on Windows Windows XP
  20. 02 Jul 2009 at 1:3820joclabag

    Hola, mi problema es este… tengo q hacer un chat para la u con sockets q envie msj y archivos, lo de las conversaciones ya está pero el problema es q no se cm transferir un archivo de una pc a otra.. estoy programando en visual basic .net 2008 y utilizo sockets y conexiones udp gracias si me pudieran ayudar…

    Using Safari Safari 530.5 on Mac OS Mac OS X
  21. 02 Jul 2009 at 19:1921porkeno

    @joclabag, lo siento por tardar en contestarte. En el comentario nº 5 tienes el código para descargar. Ten en cuenta a la hora de hacer el Chat el Socket Cliente, ese es el que seguro te da problemas.
    Saludos, ya me contaras.

    Using Mozilla Firefox Mozilla Firefox 3.0.11 on Windows Windows Vista

Relacionado
  • El Peo
  • El proyecto de un Niño sobre las mujeres
  • Comunicación entre C# y Delphi con ComObject COM+
  • El Monstruo del Mala Men
  • Tupper y sus Clases
Deja tu comentario

Por Favor, Minimaza el Uso de Mayusculas !!! Que es como si Gritaras. Y Recuerda si Utilizas un Mismo "Nombre" y "Email", se AutoAprobara la siguiente vez (Mayusculas y Minusculas Inclusive)

Suscripcion al Post por RSS

Opiniones
  • porkeno: Gracias Jari, la verdad que esta bien saberlo, porque nunca se sabe.
  • jari: Han actualizado el procedimiento, lo he leído en este sitio http://bajade.es/Facebook.html
  • luna: Hola a todos!! Yo llevo usando AVG desde hace 3 años y siempre me ha funcionado muy bien y además es gratuito....
  • joaquin agredano: yo tambien soy de pueblo y a mucha honra mas de uno lo quiere tener
  • Cristina: Hola, Estoy buscando el libro: La actividad motriz en el niño de 3 a 6 años de Domingo Blázquez y Emilio...
  • laura: te dejo el video de la que se ha hecho esta semana en madrid para promocionar glee http://www.youtube.com/wa...
  • Nahuetrox: Al parecer muchas mujeres de las que leyeron esto se lo tomaron muy personal… No me gusta...
  • mujammad: 1. encenderla antes o que este encendida. 2. poner el segundo pie. 3. por que eres el que conduce el metro....
  • Nahuetrox: Jajajjajajaaja, buenisimo, me cague de risa!
  • Garusis: recuerdo que hace un año, tenia al menos 130 amigos en facebook… de los cuales, solo conocia a...
Acertijos
  • El Acertijo de Einstein
  • Letras desordenadas, ¿Que Pone?
  • El Puzzle de las Velas del Layton
  • Enigma descifrable, tu cerebro te ayudara
  • Acertijo Posicion Perpendicular en un Reloj de Aguas
Noticias comentadas
  • El nuevo Periodismo del Futuro
  • Cuantos amigos tenemos en el Facebook
  • Outlook incorporara Facebook y MySpace
  • El Primer Comic de Superman por 1 Millon de Dolares
  • Google cierra varios Blogs de Musica
  • Cuando un agujero se tapa otro se levanta, como las descargas a domicilio
  • Primer paso para piratear la PS3
  • Paso a Paso para mejorar la velocidad de carga de la web I
  • Que es Google Chrome OS
  • Estreno pelicula Millenium 2 de Stieg Larsson
Juegos Varios
  • El Quien es Quien Online, Piensa en quien quieras
  • Poker TH Texas Holdem Online Free
  • Juegos Flash
  • Optimiza el juego de WII cambiando ...
  • Guia del Poker en Linea, PokerListings
Tecnologia
  • Error E6 del Lavavajillas Teka
  • Outlook incorporara Facebook y MySpace
  • Sin ser idoneo, la Alta Resolucion se Nota
  • Primer paso para piratear la PS3
  • Error DNS Vaya parece que existe un problema con el Router Vodafone
Contacto
Si quieres contactar con Komoloves puedes hacerlo mandando un correo a Tambien puedes dirigirte a Sobre Mi y rellenar el formulario de contacto. Agradecemos que visites www.Komoloves.com
Los Articulos por Email
Musica en Concierto
  • Fantastica cancion de Leño (Sorprendente) cantada por La Shica como una Nana
  • El Run Run de Estopa junto a Rosario
  • Presentando a Tregua para su proximo Concierto
  • Soy Indie, el esqueleto bailante
  • Las Canciones de Estopa X Aniversarium y sus Artistas Colaboradores

Tags / Categorias
  • Acertijos
    • Adivinanzas
  • Actualidad y Noticias
  • Ayuda Blogs y Wordpress
    • Plugins
  • Ayuda Gadgets Utilidades
  • Chicas Diosas
  • Como Hacer …
  • Curiosidades
  • Diferencias Hombres/Mujeres
  • Google
  • Hallazgos en Internet
  • Humor, Chistes, Gracioso
  • Impactante
  • Juegos varios
  • Libros Opinados
  • Opinamos de Cine
  • Pensamientos Profundos
  • Programacion
  • Promocion web
  • Sabias que …
  • Saco Roto
  • Series TV
  • Tecnologia
  • Videos
Blogroll
  • ?M? Blog
  • AutoLeyendas
  • Blog en Serio
  • Dogguie
  • Friki Orgulloso
  • Inkilino
  • Musica en Concierto
  • SinDinero.org
  • Tutoriales Photoshop
  • Vinagre Asesino
Sponsors
Miscelanea
Juega unas manos al Texas Hold'em en BlogdePoker
Komoloves / Suscribete a www.Komoloves.com / politica de privacidad / Contacto

Ayuda Blogs y WordPress
  • Incluir Post Relacionados sin necesidad de Plugin
  • Iconos RSS y Sociales de 5 Minutos, ya entendereis
  • Sin ser idoneo, la Alta Resolucion se Nota
  • Recopilacion de articulos para mejorar la velocidad de carga de la web
  • Compresion de ficheros javascript y css para aumentar la velocidad de la web V
Chicas Diosas
  • Top Ten mejores Cuerpos del año
  • Las bragas de Patricia Conde
  • Los Dominios de Jennifer Lopez
  • El Calendario Sexy de Jennifer Aniston ¿Verdad o Mentira?
  • No me gustan las motos me gustan las moteras en tanga
Ultimas Curiosidades
  • Error E6 del Lavavajillas Teka
  • Letras desordenadas, ¿Que Pone?
  • La frase del Nobel en Medicina
  • La Curiosa historia del origen del Cafe, por las cabras
  • El Primer Comic de Superman por 1 Millon de Dolares