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! >
