Hola

 

La propiedad connected del socket no indica el estado ACTUAL de la conexión
entre los endpoints, sino el estado de la conexión en la operación más
reciente. Leemos en la documentación:

 

El valor de la propiedad Connected refleja el estado de la conexión a partir
de la operación más reciente. Si tuviera que determinar el estado actual de
la conexión, realice una llamada de envío (Send) de cero bytes y de no
bloqueo. Si la llamada se devuelve correctamente o inicia un código de error
WAEWOULDBLOCK (10035), el socket seguirá conectado; de lo contrario, ya no
tendrá conexión. Cuando se llama a Connect
<http://msdn.microsoft.com/es-es/library/system.net.sockets.socket.connect.a
spx>  en un socket de protocolo de datagrama de usuario (UDP), la propiedad
Connected siempre devuelve true; esta acción, no obstante, no cambia la
naturaleza inherente de no conectividad del UDP. 

Con lo cual el WHILE .connected puede ser que no funcione correctamente.

Carlos

 

De: [email protected] [mailto:[email protected]] En nombre de Marcel
Felix
Enviado el: lunes, 29 de junio de 2009 20:32
Para: [email protected]
Asunto: [puntonet] TcpClient envío y recepcion de mensajes

 

Hola a todos.

 

Les platico el problema.

 

Tengo una aplicación de consola hecha en c# que funciona como cliente de un
Servidor remoto el cual no tengo idea de cómo esté programado, pero sé que
recibe peticiones en un puerto de un socket.

 

Mi aplicación al iniciar crea un objeto tcpClient que abre una conexión con
el servidor y envía como mensajes cadenas de texto plano. Hasta aqui no hay
problema. Mando mi mensaje y el servidor lo recibe. El envío de mensajes lo
hago a través de un streamwriter, mediante una función que se llama
EnviarMensaje :

 

 StreamWriter sw;

 sw =  new streamWriter(tcpClient.getStream()); 

 sw.WriteLine(mensaje) 

 sw.flush();

 

 

Para la recepción de los mensajes que me manda el servidor, he creado un
streamReader que lee los datos del mismo stream del tcpClient. Algo como;

 

StreamReader sr;

sr =  new StreamReader(tclClient.getStream());

string respuesta =  sw.ReadLine();

 

El envío de mensajes funciona ok. El problema es que no recibo los mensajes
que me manda el servidor. La recepción de mensajes del servidor se hace en
un thread que dentro de un ciclo while (mientras esté conectado), debe
guardar en un string lo que obtenga de sr.ReadLine();

 

Esta aplicación funciona bien en mi entorno de desarrollo, junto con una
aplicación de prueba que hice para simular al servidor real al que tengo que
conectarme. El problema surgió ahora que ya tuve que conectarme al servidor
real. Recibe mis mensajes pero mi aplicación no recibe los del servidor.
Parece que nunca se cumple la condición while(conected)

 

¿cómo es posible que todo funcione sin problemas en mi entorno y no reciba
nada cuando intento comunicación con el servidor real? 

Un detalle es que sí recibí las respuestas del servidor, pero solo hasta que
la aplicación del servidor se cerró, 

 

¿No es correcto que use el mismo tcpclient para leer y escribir del Stream?

 

¿Tendría que tener en mi aplicación cliente un tcpListener para recibir los
mensajes? Pero si así fuera, no tendría que funcionar tampoco en mi entorno
de prueba  ¿o si? ¿y por que funcionaría solo cuando la aplicación remota se
cierra?

 

Gracias de antemano. 

 

Responder a