elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Socket send and recv problema
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Socket send and recv problema  (Leído 6,016 veces)
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Socket send and recv problema
« en: 28 Junio 2013, 06:36 am »

Tengo un problema con los socket cuando envió y recibo, esto es porque tengo punteros en la clase que estoy enviando, entonces al recibirla me da error de:  Segmentation fault;

esta es la situación que tengo:

Clase a enviar:
Código
  1. #define TAMANO_MENSAJE 50
  2.  
  3. class Mensaje {
  4. private:
  5. //char mensaje[TAMANO_MENSAJE];
  6. string mensaje;
  7. public:
  8. Mensaje();
  9. Mensaje(char);
  10. string getMensaje(){return mensaje;}
  11. };
  12.  


Esta es la función que envía:
Código
  1. int Sender::SendMensaje(Mensaje &pMensaje){
  2. return send(this->host->getSocket(), &pMensaje , sizeof(pMensaje) ,0);
  3. }
  4.  

Esta es la función que recibe:
Código
  1. Mensaje Receiver::RecvMensaje(){
  2. Mensaje rm;
  3. recv(host->getSocket(), &rm, sizeof(rm), 0);
  4. return rm;
  5. }
  6.  

El problema esta en el string, ya que es un puntero, puedo enviar el tamaño exacto del paquete del lado del cliente, pero cuando tengo que recibirlo no se de que tamaño es el paquete, si alguien me puede ayudar!!!


En línea

<<<--Basura-->>>
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Socket send and recv problema
« Respuesta #1 en: 28 Junio 2013, 08:34 am »

Tengo un problema con los socket cuando envió y recibo, esto es porque tengo punteros en la clase que estoy enviando, entonces al recibirla me da error de:  Segmentation fault;

esta es la situación que tengo:

Clase a enviar:
Código
  1. #define TAMANO_MENSAJE 50
  2.  
  3. class Mensaje {
  4. private:
  5. //char mensaje[TAMANO_MENSAJE];
  6. string mensaje;
  7. public:
  8. Mensaje();
  9. Mensaje(char);
  10. string getMensaje(){return mensaje;}
  11. };
  12.  


Esta es la función que envía:
Código
  1. int Sender::SendMensaje(Mensaje &pMensaje){
  2. return send(this->host->getSocket(), &pMensaje , sizeof(pMensaje) ,0);
  3. }
  4.  

Esta es la función que recibe:
Código
  1. Mensaje Receiver::RecvMensaje(){
  2. Mensaje rm;
  3. recv(host->getSocket(), &rm, sizeof(rm), 0);
  4. return rm;
  5. }
  6.  

El problema esta en el string, ya que es un puntero, puedo enviar el tamaño exacto del paquete del lado del cliente, pero cuando tengo que recibirlo no se de que tamaño es el paquete, si alguien me puede ayudar!!!

y el tamaño del paquete que recibes es el mismo de la clase supongo ,si recibes paquetes incompletos capaz que te puede ayudar el MSG_WAITALL que es una señalizacion de recv q  se utiliza para que no devuelva el mensaje hasta que el buffer suministrado este completo..

recv(host->getSocket(), &rm, sizeof(rm), MSG_WAITALL);

si no es esto, no entendi bien .

pero ...

no estas enviando la cantidad de bytes que ocupa un objeto de la clase mensaje??? , y no estas recibiendo la cantidad de bytes que ocupa un objeto de esa misma clase?? suponiendo que las clases son iguales para los 2 programas


« Última modificación: 28 Junio 2013, 08:44 am por ThePinkPanther » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Socket send and recv problema
« Respuesta #2 en: 28 Junio 2013, 09:39 am »

Código
  1. std::string prueba;
  2.  
  3. std::cout << sizeof( prueba ) << std::endl;
  4.  
  5. prueba = "ASDFASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDASDFASDFASDFA";
  6.  
  7. std::cout << sizeof( prueba ) << std::endl;

resultado:
32
32

expilcación:

sizeof es un operador estático que se resuelve en tiempo de compilación, por este motivo no te va a devolver nunca el tamaño real de un buffer dinámico.

Para trabajar con sockets suele ser más adecuado crear estructuras con tamaños definidos y delimitados y enviar esos paquetes se usen o no todos los bytes.

Me explico:
Código
  1. struct Paquete
  2. {
  3.  char[50] cadena;
  4. };
  5.  
  6. // ...
  7.  
  8. int Sender::SendMensaje(Mensaje &pMensaje)
  9. {
  10.  struct Paquete to_send;
  11.  strncpy( to_send.cadena, pMensaje.getMensaje( ), 49 );
  12.  
  13.  return send(this->host->getSocket(), &to_send , sizeof(struct Paquete), 0);
  14. }

Y para recibirlo es similar... creas otro paquete, almacenas los datos en el paquete y después guardas el contenido en pMensaje.
« Última modificación: 28 Junio 2013, 09:46 am por eferion » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Socket send and recv problema
« Respuesta #3 en: 29 Junio 2013, 20:33 pm »

Ni send() ni recv() trabajan con la clase string directamente, para hacer eso sustituye esto:

Código
  1. return send(this->host->getSocket(), &pMensaje , sizeof(pMensaje) ,0);

Que no tiene mucho sentido, por esto:

Código
  1. return send(this->host->getSocket(), pMensaje.getMensaje().c_str() , pMensaje.getMensaje().size() ,0);

Y lo mismo con la función que recibe.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Socket send and recv problema
« Respuesta #4 en: 2 Julio 2013, 08:37 am »


Código
  1. return send(this->host->getSocket(), pMensaje.getMensaje().c_str() , pMensaje.getMensaje().size() ,0);


El problema es que, cuando recibe no se sabe cuantos bytes vienen, y también que string es un puntero, entonces causa Segmentation fault, Creo que lo mejor es trabajar con datos estáticos, para evitar problemas, pero lo que quería era optimizar el trafico de red. pero creo que es un poco difícil
En línea

<<<--Basura-->>>
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Socket send and recv problema
« Respuesta #5 en: 2 Julio 2013, 10:01 am »

El tráfico de red se puede optimizar... pero mi consejo es ir por partes... primero haz que funcione y luego lo optimizas.

En línea

<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Socket send and recv problema
« Respuesta #6 en: 5 Julio 2013, 08:26 am »

El tráfico de red se puede optimizar... pero mi consejo es ir por partes... primero haz que funcione y luego lo optimizas.

Si te digo que ya funciona que lo que busco es optimizar??
En línea

<<<--Basura-->>>
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Socket send and recv problema
« Respuesta #7 en: 5 Julio 2013, 08:52 am »

jajajajaja.

Por curiosidad, cuántos bytes ocupan los datos que envías ??

si son una docena o incluso unas pocas centenas de bytes olvídate de optimizar, ya que el rendimiento va a ser prácticamente el mismo y a cambio te vas a complicar bastante el envío.

Me explico:

Las redes, sean del tipo que sean, tienen definido un tamaño máximo del paquete de datos que puede circular por ella (MTU).

Si tu envías un paquete de menor tamaño este circula sin problemas... si intentas enviar uno más grande, el equipo tiene que trocearlo en paquetes más pequeños que se envían de forma individual.

El problema cuando se trocean los paquetes depende del protocolo utilizado ( TCP o UDP ):

* TCP es un protocolo negociado, no se pierden paquetes y todos llegan ordenados, pero es lento por toda la negociación que lleva asociada... en este caso trocear paquetes implica un período de latencia mayor y para determinadas aplicaciones esto es un problema.

* UDP es un protocolo más crudo, la negociación la tienes que programar tú, los paquetes pueden perderse e incluso llegar desordenados. Debido a la falta de negociación, el protocolo es bastante más rápido. El problema asociado a este protocolo viene de que no posees control sobre los paquetes troceados... pueden producirse problemas si se pierde algún paquete...

Para que te hagas una idea, valores normales de MTU son 576 y 1500 bytes. En redes locales el valor normal es 1500.

Enviar un paquete de 1500 bytes a través de una red local típica ( 100 Mbps ) llevaría ( 1500 * 8 ) /  1e8 = 0,00012 s = 0,12 ms ( milisegundos ).

Si en vez de enviar 1500 bytes consigues reducirlo a 1000 el paquete se enviará en 0,08 ms.

En serio te compensa complicarte la programación del envío y la recepción de los paquetes para ahorrarte 40 microsegundos por paquete??

Aún así, en el caso de que tuvieses que enviar paquetes grandes ( imagínate que necesitas enviar un archivo ), la opción más empleada es dividir el archivo en paquetes de un tamaño preestablecido ( por ejemplo 400 bytes ) y enviar cada uno de esos paquetes tal cual. Luego en el receptor se reensambla el fichero y listo.

Nota: Y antes de que alguno me salte a la yugular, la conversión de Kb a b depende del medio... en memorias y discos hay que dividir por 1024, en redes el factor es 1000.

En línea

<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Socket send and recv problema
« Respuesta #8 en: 2 Septiembre 2013, 04:58 am »

Toda esa teoría que me explicaste ya la conocía de antemano, los bytes que envió son variados, ya que son diferentes clases y diferentes tamaños.
El problema que tenia era cuando enviaba punteros... se enviaban perfectamente, pero cuando llegaban al otro lado causaban un Segmentation fault?? Entiendes ??
En línea

<<<--Basura-->>>
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Socket send and recv problema
« Respuesta #9 en: 2 Septiembre 2013, 11:05 am »

Toda esa teoría que me explicaste ya la conocía de antemano, los bytes que envió son variados, ya que son diferentes clases y diferentes tamaños.
El problema que tenia era cuando enviaba punteros... se enviaban perfectamente, pero cuando llegaban al otro lado causaban un Segmentation fault?? Entiendes ??

Muy sencillo no podes enviar punteros ... hace una copia de los datos y envialos. En otra maquina (incluso en otro proceso) el espacio de memoria es totalmente independiente asi que el puntero es invalido o peor, apunta a otra cosa ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error con el manejo de send y recv
Programación C/C++
Mr.Blue 2 3,487 Último mensaje 26 Noviembre 2010, 20:01 pm
por Mr.Blue
recv() socket error?
Programación C/C++
Riki_89D 6 3,993 Último mensaje 14 Octubre 2011, 21:09 pm
por Riki_89D
porque no funciona send() y recv()?
Programación C/C++
Belial & Grimoire 1 2,018 Último mensaje 21 Julio 2013, 04:12 am
por Belial & Grimoire
Enviar class por socket send windows
Programación C/C++
patilanz 9 3,351 Último mensaje 29 Mayo 2014, 08:20 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines