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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Enviar class por socket send windows
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Enviar class por socket send windows  (Leído 3,019 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Enviar class por socket send windows
« en: 26 Mayo 2014, 07:57 am »

Hola estoy haciendo un chat en consola con c++ en windows pero quiero enviar una clase msg que contiene el tiempo el usuario y el msg.


Código
  1. class msg{
  2. public:
  3. msg(){};
  4. msg(string n,string m,time_t t=time(0)){
  5. name=n;
  6. r_msg=m;
  7. tim=t;
  8. };
  9. string getName(){return name;}
  10. string getR_msg(){return r_msg;}
  11. time_t getTime(){return tim;}
  12.  
  13. private:
  14. string r_msg;
  15. time_t tim;
  16. string name;
  17. };

Ahora quiero enviar la con send(); Pero también quiero mandar un código de mensaje. Lo intente convirtiendo la clase msg en char * moviendo lo 1 char para delante para poder poner el código del msg. Pero son demasiadas conversiones y al final el resultado no fue lo que esperaba. Luego intente crear esta clase:

Código
  1. #include "stdafx.h"
  2. #ifndef CONECTION_MSG_CPP
  3. #define CONECTION_MSG_CPP
  4. template <typename t>
  5. class connection_msg{
  6. public:
  7. connection_msg(int cod,t cl){
  8. code=cod;
  9. clas=cl;
  10. }
  11. int getCode() const {return code;};
  12. private:
  13. int code;
  14. t clas;
  15. };
  16.  
  17. #endif
El t es la clase que quiero mandar pero el problema aquí es que lo convierto a char* pero luego para convertirlo otra ves a la clase connection_msg me pide el tipo t que no se sabe.

Alguna idea ?

Saludos


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #1 en: 26 Mayo 2014, 08:34 am »

Por un socket no se puede "enviar" una clase a lo bestia.

El motivo es que sus miembros, por ejemplo la clase string, gestionan memoria dinámica, por lo que si envías una clase "a pelo" la aplicación va a fallar siempre.

Lo que tienes que hacer es "serializar" la clase. Serializar es algo común en programación; cuando guardas una clase en un archivo la estás serializando.

Obviamente no hay una única forma de serializar los datos, depende del uso posterior que se les vaya a dar.

En el caso de las redes, la mejor opción es valerse de algún protocolo a nivel de aplicación para gestionar el serializado. Algunos ejemplos de estos protocolos son: Json, Protocol buffers, XDR, ASN.1

Estos protocolos no son parte del estándar de C++, para poder usarlos tendrás que bajarte alguna librería que los implemente o currarte tu propia implementación. La ventaja es que encontrarás librerías para la gran mayoría de los lenguajes existentes.



En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #2 en: 26 Mayo 2014, 19:06 pm »

@patilanz:
Podes hacer una estructura predefinida la cual sera compartida por ambos programas e incluyendo toda la información que quieras. para
punteros a memoria serian reemplazados a offsets que junto a la base apuntaran a la cadena que es agrega al final de la estructura
predefinidia, hay muchas posibilidades.
En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Enviar class por socket send windows
« Respuesta #3 en: 27 Mayo 2014, 22:25 pm »

Hola gracias a los dos. Ya esta solucionado. Lo que hice fue crear una clase que tiene miembros el codigo del msg y la clase que se va pasar como mensaje. Lo pongo por si alguien quiere ver como es:

Código
  1. #include "stdafx.h"
  2. #ifndef CONECTION_MSG_CPP
  3. #define CONECTION_MSG_CPP
  4. template <typename t>
  5. class connection_msg{
  6. public:
  7. connection_msg(int cod,t cl){
  8. code=cod;
  9. clas=cl;
  10. }
  11. int getCode() const {return code;}
  12. t getClass() const {return clas;}
  13. private:
  14. int code;
  15. t clas;
  16. };
  17.  
  18. #endif

Luego cuando envio el mensaje convierto la clase en char* y al recibir la vuelvo a convertir a connection_msg.

Saludos
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #4 en: 27 Mayo 2014, 23:01 pm »

Hola gracias a los dos. Ya esta solucionado. Lo que hice fue crear una clase que tiene miembros el codigo del msg y la clase que se va pasar como mensaje. Lo pongo por si alguien quiere ver como es:

Código
  1. #include "stdafx.h"
  2. #ifndef CONECTION_MSG_CPP
  3. #define CONECTION_MSG_CPP
  4. template <typename t>
  5. class connection_msg{
  6. public:
  7. connection_msg(int cod,t cl){
  8. code=cod;
  9. clas=cl;
  10. }
  11. int getCode() const {return code;}
  12. t getClass() const {return clas;}
  13. private:
  14. int code;
  15. t clas;
  16. };
  17.  
  18. #endif

Luego cuando envio el mensaje convierto la clase en char* y al recibir la vuelvo a convertir a connection_msg.

Saludos
Eso estaria bien para clases que no contiene punteros a memoria dinamica o la mayoria de punteros a memoria, pero a pesar de eso
yo no recomiendo tener un habito de pasar clases entre programas de esa manera es muy inseguro.

En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Enviar class por socket send windows
« Respuesta #5 en: 28 Mayo 2014, 07:50 am »

Hola si no paso los datos así. Como serian los offset ? Crear una variable int que contiene el offset de los punteros o como?  Y el offset de un puntero es el lugar donde acaba?

Gracias
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #6 en: 28 Mayo 2014, 08:54 am »

Yo te dí una solución... aunque no le hayas prestado mucha atención:

XDR, Protocol buffers, Json...

Tutorial protocol buffers

Ejemplos con JSon

Estos protocolos que te comento son a nivel de aplicación, su utilidad es que te permiten enviar cualquier tipo de información sin importar el lenguaje o el sistema sobre el que esté corriendo el ejecutable. Te abstraes de punteros, referencias y particularidades del lenguaje.

Esto se consigue a costa de añadir una capa más a tu código. Puedes conseguir lo mismo escribiendo tú mismo los datos a enviar, pero ahí tendrás que lidiar con los datos tanto en el lado del cliente como en el del servidor.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #7 en: 28 Mayo 2014, 09:13 am »

Hola si no paso los datos así. Como serian los offset ? Crear una variable int que contiene el offset de los punteros o como?  Y el offset de un puntero es el lugar donde acaba?

Gracias
La base + offset apuntarian a la cadena dentro de la estructura enviada.
otra manera seria declara un entero que contenga el numero de cadenas y una variable de tipo cadena, deben ser ultimos
miembros de preferencia luego escribir al final de la estructura todas las cadenas que necesites, al recibir, validar el numero
de cadenas e ir atravez de la cadena. Cada cadena se distingira por el null y para saber el numero de cadenas y no acceder
a memoria invalida seria el miembro que contendra el numero de cadenas.
En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Enviar class por socket send windows
« Respuesta #8 en: 29 Mayo 2014, 07:59 am »

Hola eferion sin me fije en tu respuesta pero al principio me parecio algo mas de trabajo si podias simplemenet usar char* pero luego me di cuenta de que necesitas lo que me dijiste. Vi tus links y se ve muy interesante.

x64Core voy a probar lo que me dijiste a ver que tal.

Pero creo que voy a utilizar json aunque quiero aprender el protocol buffer.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Enviar class por socket send windows
« Respuesta #9 en: 29 Mayo 2014, 08:20 am »

Obviamente implementar un mecanismo de este tipo lleva algo más de trabajo y tiempo que enviar las cosas "a pelo". Lo que sucede es que si luego quieres comunicar, por ejemplo, una aplicación en C++ con otra en Java, lo mismo tienes que acabar haciendo chapucillas manuales para que la comunicación pueda realizarse satisfactoriamente... utilizando un protocolo a nivel de aplicación evitas este tipo de problemas.

La ventaja de hacer uso de un protocolo de este tipo ya existente es que, por un lado, ya están probados y, por otro, es más fácil encontrar librerías para los diferentes lenguajes y arquitecturas.

Piensa que a la hora de diseñar estos protocolos ya se tuvieron que pegar con el envío de objetos, punteros y referencias... todo eso lo tienes cubierto.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
enviar un BufferedImage a travez de socket
Java
egyware 6 21,382 Último mensaje 3 Diciembre 2010, 02:04 am
por passatempo
Socket send and recv problema « 1 2 »
Programación C/C++
<<<-Basura->>> 10 5,511 Último mensaje 2 Septiembre 2013, 11:26 am
por eferion
Ayuda error al enviar imagen por socket C#
.NET (C#, VB.NET, ASP)
boy-ka 3 4,239 Último mensaje 25 Junio 2015, 06:54 am
por El Benjo
Firefox Send te permite enviar archivos cifrados de 2,5GB con varios métodos ...
Noticias
wolfbcn 0 773 Último mensaje 12 Marzo 2019, 21:53 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines