/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Configuracion de los socket para enviar MUCHOS datos.

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Tab3r



Registrado: 01 Feb 2006
Mensajes: 9
Ubicación: Madrid, España

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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? Smile
Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 285
Ubicación: Buenos Aires, Argentina

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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 Razz
Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 285
Ubicación: Buenos Aires, Argentina

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com