Hola!, el hecho que no recibas en forma completa tus datos se puede deber a
muchos factores... pueden ser interferencias en la estructura de red, cables
con mal contacto, o simplemente sucede... no te olvides que esta
comunicación depende de un medio físico y puede fallar, nada te asegura que
la comunicación sea siempre constante y completa.
Por ello formas de comunicación  (como el TCP/IP) implementan control de
redundancia y solicitan el reenvío de comunicación si algo falta...... claro
que esto es a nivel paquetes dentro de una "charla" entre dos entidades
(computadoras, routers, o lo que fuere).

Vos deberías de implementar algo por el estilo en un principio.... tener por
ejemplo algún identificador de fin de cadena, y si cuando hacés la lectura
el mismo no aparece, solicitarle a quién te lo envió que lo vuelva a
hacer........ claro está que tendrías que recibir info de quién es el
"remitente" de esos datos y del otro lado tener la capacidad de escuchar
también y no solo de enviar información.... en pocas palabras, formar tu
"protocolo" de comunicación entre esas aplicaciones.

Por otro lado, ¿puede ser que tu función no esté haciendo bien la lectura?
Mirá, estás poniendo: socket.receive(buffer);
Confiamos en que que eso lee todo lo que recibe ...imaginate que si eso no
funcionaría bien pendería de un hilo cientos de miles aplicaciones .net en
el mundo........  vos deberías de encarar el tema (supongo) por el lado del
thread que estás creando...... ¿los procesos que se ejecutan en el hilo
comparten algún recurso? ¿estás usando semáforos o bloqueadores correctos
para que salvar esas secciones críticas? ¿no será que varios hilos están
pisándose entre si porque escribís (o lees) en algún lugar común de memoria
sin sincronizarlos?

Eso que te pregunto forma parte de lo que se ejecuta dentro del thread y
precisamente es la parte de código que no veo hayas publicado.

Y respecto a tu pregunta sobre si hay alguna manera de optimizar el socket
para que reciba la mayor cantidad de información posible:
1.- tenés que ver el limitante físico, no vas a transmitir más información
que lo que la red permita ... fijate ahí qué placas de red tenés y que
velocidades de transmisión soportan.
2.- tenés un limitante en cuanto a potencia de cálculo .... ¿qué tan potente
es el procesador para poder tratar lal cantidad de información que llega por
la red?
3.- podés tener también un limitante en cuanto a la configuración de la
red... la configuración de la misma influye en la calidad de la información
y la necesidad (o no) de solicitar re-envio de información.
4.- otro limitante lo tenés en tu algoritmo (el cual no se ve mucho) ...
puede que estés haciendo pasos que no son necesarios o puede que sea posible
optimizarlo.

En fin ... como te darás cuenta es una cuestión de lógica e infraestructura.

Yo en tu lugar comenzaría por identificar las cadenas incompletas (logueando
esos casos) antes de lanzar el thread para determinar si es un problema
físico o lógico.... si la información llega bien y el problema es despueś
del thread, tenés algún error en el código, si la info viene mal, el
problema está en la red o en el emisor de la información.

Saludos y espero te sirva de ayuda.



Algunas veces me considero un pescador. Los programas de ordenador
y las ideas son mis herramientas, cañas y redes. Los gráficos que aparecen

en mi pantalla son trofeos y deliciosas mieles.
Clifford A. Pickover,
Computers, Pattern, Chaos and Beauty
--------------
Si vi mas allá del horizonte, fue porque me paré sobre hombros de gigantes
Isaac Newton


2010/8/2 Marcel Felix <[email protected]>

> Hola a todos, buen día.
>
> Tengo una aplicación desarrollada con c# framework 2.0. Esta aplicación
> consiste en un socket que recibe envia y recibe mensajes, cadenas de texto
> de alrededor de 100 caracteres. El intercambio de mensajes es intensivo la
> mayor parte del día. Alrededor de 90 - 100 por minuto y en horas pico hay
> lapsos de hasta 160 - 170 por minuto.
> Mi aplicación se encarga de enviar los mensajes conforme van llegando, uno
> tras otro, y la recepción de mensajes la tengo implementada en un thread que
> llama a una función que recibe mensajes y es de la siguiente forma:
>
>    void recibirmensaje()
>    {
>       while(conectado)   //variable booleana que se asigna a true cuando
> hago la conexion del socket
>       {
>          if(socket.available > 0)
>          {
>              datosrecibidos = socket.receive(buffer);
>              respuestaServidor = Encoding.ASCII.GetString(buffer, 0,
> datosRecibidos);
>              //la cadena recibida la proceso en otro thread
>              cMensajeRecibido oMjs = new
> cMensajeRecibido(respuestaServidor, CadenaCn, tiempoEspera, appPath,
> SegundosTimeOut);
>              new Thread(new ThreadStart(oMjs.ProcesarRespuesta)).Start();
>
>          }
>       }
>    }
>
> Pero tengo dos problemas:
>     El primero es que a veces la respuesta no la recibo completa. En lugar
> de los 100 caracteres recibo la mitad. Lo primero que se me ocurre es que
>     del otro lado no me esten mandando la cadena completa pero ¿es posible
> que sea mi función la que no está haciendo bien la lectura? ¿por que
>     solo ocurre cuando hay muchos envios y respuestas seguidos?
>     Si del otro lado siempre me mandan las respuestas completas ¿Hay alguna
> manera de asegurar que mi aplicación reciba todas las respuestas completas?
>
>     El segundo es que a veces hago el envío y la respuesta no la recibo, o
> no la alcanzo a recibir. Esto ocurre cuando hago muchas peticiones
>     seguidas, por ejemplo en el mismo segundo. En este caso mis dudas son
> similares al primer punto, y asumiendo de entrada que del otro lado sí me
>     estan respondiendo todas.
>
> Es decir ¿Hay alguna manera de optimizar el uso del socket para que reciba
> la mayor cantidad de respuestas que le lleguen?
>
> ¡Gracias!
>

Responder a