| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 07/02/2006 5:01 am | | | Título: Configuracion de los socket para enviar MUCHOS datos. |
| Hola.
Estoy inmerso en un proyecto bastante complejo de computacion distribuida en C. Nos basamos en maquinas linux heterogeneas.
El problema viene al enviar alrrededor de 1000000 de long double... esto no provoca ningun error pero si que los datos no lleguen (me explico, el buffer de recepcion se llena hasta que a un nivel se llena pero de ceros).
Se que el problema que arrastro es por los buffer de recepcion y envio... con setoptsock podria arreglarlo, pero no encuentro ninguna documentacion completa...
¿Alguien sabe del tema? |
|
| Volver arriba | |
 |
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 07/02/2006 6:25 am | | | Título: |
| Asumo que se trata de socket TCP. _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
holylance
Registrado: 03 Ene 2006 Mensajes: 114 Ubicación: Argentina
| Publicado: 07/02/2006 6:29 am | | | Título: |
| con la sinceridad que me caracteriza, te digo que no tengo idea, perome gustaría tenerla... con respecto a eso ahora te voy a decir lo que pienso pero seguro que es medio fruta lo que te voy a decir :p
bueno, primero, ¿como es eso de que se llena de ceros?, es decir: 1 te llegan menos long doubles y se te llena de ceros el buffer? 2 te llegan menos long doubles y te queda el buffer lleno de ceros a partir de algun indice en el buffer, pero eso no molesta?
si los datos no llegan, no llegan, tenes que poder darte cuenta de que no llegaron, no pidas memoria de a un millon de long doubles :p , pedi dinámicamente (como le estoy dando a la fruta hoy!).No entiendo cual es el problema de que no te lleguen los doubles, tenes que esperarlos, pone un timeout y listo, supongo que eso estara todo implementado ya... como ves sigo mandando fruta, fuera de joda, no entiendo pero me gustaría, no me explicas mas a fondo che?  |
|
| Volver arriba | |
 |
|
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 07/02/2006 6:48 am | | | Título: |
| Lo más importante es saber si es TCP. Dado que el protocolo se encarga de particionar los paquetes en forma automática y tiene un sistema de control de errores completo, con lo cual lo que describe es muy extraño. La cosa es completamente diferente si tratan de hacer eso en UDP. En ese caso sería imposible enviar esa cantidad de datos en un paquete. _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 07/02/2006 9:24 am | | | Título: |
| Me voy a autoresponder... Pero antes os aclaro.
Tengo un array VARIABLE de "long double" que se llena con datos en cada ejecucion. La longitud media es de 150.000 elementos dentro del array. Se hacen muuuchos calculos sobre cada elemento, por lo que estamos haciendo una plataforma cliente-servidor con sockets TCP (aunque creo que nos vamos a pasar a UDP por razones de velocidad) para distribuir el calculo. Mediante hilos, creo X sockets por cada hosts que vaya a recibir un trozo de array para calcular.
El problema surgia cuando pasabamos de mas de 333 a cada uno de los hosts... hasta un punto se llenaba de numeros pero al llegar a la posicion 120, TODO ERAN CEROS... ¿Porque?... 2 dias mirando foros en ingles y al final vi en un ejemplo algo tal que asi:
| Código: | ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF, (char *)&sock_buf_size, sizeof(sock_buf_size) );
ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF, (char *)&sock_buf_size, sizeof(sock_buf_size) );
|
Tras trastear mucho, y no funcionarme (subir el tamaño empeoraba las cosas) y tras mirar y remirar las paginas "man", vi que otro chaval habia puesto "sock_buf_size=0"...
Tras estudiar lo que hacia, no cabia en mi gozo cuando vi que todo funcionaba con esto a cero.
Espero que a alguien le sirva de ayuda como a mi. Un saludo. |
|
| Volver arriba | |
 |
holylance
Registrado: 03 Ene 2006 Mensajes: 114 Ubicación: Argentina
| Publicado: 07/02/2006 12:50 pm | | | Título: |
| | de vuelta y con humildad, no tengo idea por que esa linea tiene la culpa/magia, pero odio cuando una sola linea tiene la culpa de que todo ande mal, hace poco habia hecho una rutina para calcular una cosa con conjuntos y comome faltaba una linea no andaba nada...lo peor era que vos leias el codigo y parecia que todo estaba bien... |
|
| Volver arriba | |
 |
|
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 07/02/2006 5:13 pm | | | Título: |
| Bueno, finalmente estás poniendo los buffers de recepción y envío en cero. La verdad dudo que sea una buena idea, pero todo es posible.
Puede que el problema esté en que el la primer capa del protocolo no tenga memoria suficiente para guardar tanto en su buffer. Pero sería mejor, antes que negarle la posibilidad de que haga ese proceso, particionar la información y hacer varias llamas a send() con partes de la información y reconstruirla del otro lado. En UDP la cosa se les va a poner mucho más complicada. _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 08/02/2006 12:14 am | | | Título: |
| | _Leo_ escribió: | Bueno, finalmente estás poniendo los buffers de recepción y envío en cero. La verdad dudo que sea una buena idea, pero todo es posible.
Puede que el problema esté en que el la primer capa del protocolo no tenga memoria suficiente para guardar tanto en su buffer. Pero sería mejor, antes que negarle la posibilidad de que haga ese proceso, particionar la información y hacer varias llamas a send() con partes de la información y reconstruirla del otro lado. En UDP la cosa se les va a poner mucho más complicada. |
Resulta curioso.. si quito los buffers no funciona aunque SOLO envie un "long double". No entiendo porque y seguiré investigando... Os ire comentando.
Desde luego ser informatico es para vivir con stress  |
|
| Volver arriba | |
 |
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 08/02/2006 4:45 am | | | Título: |
| ¿Querés decir que no podés enviar ni un simple byte? _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
|
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 08/02/2006 8:17 am | | | Título: |
| | _Leo_ escribió: | | ¿Querés decir que no podés enviar ni un simple byte? |
Exacto. Al enviar un solo byte de muchos fallaba...
Pero gracias a los foros de los gringos he conseguido una solucion creo que final a mi problema... solo habia que modificar la sentencia recv de esta forma:
| Código: | while (num_recibidos < num_total){ num_bytes = recv(socket, buffer, sizeof(buffer), MSG_WAITALL); num_recibidos += num_bytes; }
|
Resulta que si llenamos el buffer de recepcion, se descartan todos los paquetes restantes pero se devuelve el TAMAÑO total (incluso con los descartados). Tras investigar por las webs me di cuenta que la gente usaba un metodo muy divertido que era leer y vaciar el buffer mediante codigo "guru" (no habia manera de entenderno ni de adaptarlo a mi caso), enconces alguien me desaconsejo el uso de MSG_WAITALL porque usaba muchos recursos... eso me da daba igual ya que tengo maquinas preparadas para el calculo....
Total esa es la solucion... ojo que consume muuuchaaaaa RAM.
Un saludo y espero que a alguien le ayude. |
|
| Volver arriba | |
 |
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 08/02/2006 9:43 am | | | Título: |
| No sé cómo estabas utilizando antes la función recv() ya que lo expuesto ahora es lo básico que se necesita para que funcione con TCP. _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 08/02/2006 11:31 am | | | Título: |
| | _Leo_ escribió: | | No sé cómo estabas utilizando antes la función recv() ya que lo expuesto ahora es lo básico que se necesita para que funcione con TCP. |
Usaba la version que usaba todo el mundo por los foros:
num_bytes = recv(socket, buffer, sizeof(buffer), 0); |
|
| Volver arriba | |
 |
|
_Leo_
Registrado: 20 Oct 2005 Mensajes: 285 Ubicación: Buenos Aires, Argentina
| Publicado: 08/02/2006 11:34 am | | | Título: |
| ¿Sin hacer un bucle? _________________ _Leo_ drk.com.ar
clasdix.com.ar |
|
| Volver arriba | |
 |
Tab3r
Registrado: 01 Feb 2006 Mensajes: 9 Ubicación: Madrid, España
| Publicado: 08/02/2006 1:57 pm | | | Título: |
| | _Leo_ escribió: | | ¿Sin hacer un bucle? |
Con bucle... con bucle.
Simplemente hacer la prueba de enviar 10000000 de long double a maquinas que no sean localhost y vereis pasmados el problema. |
|
| Volver arriba | |
 |
|
|