/
Inicio :: Foros

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

Problema al enviar estructura mediante un socket

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



Registrado: 14 Abr 2004
Mensajes: 69

MensajePublicado: 12/12/2005 7:13 am
Título: Problema al enviar estructura mediante un socket

Hola a todos/as:

Tengo que hacer una aplicación cliente-servidor que corra en Windows el cliente y en Solaris el servidor. Tengo un problema a la hora de que Windows envíe una estructura de datos a Solaris. Los correspondientes códigos son estos:

Código:


  // CÓDIGO DEL SERVIDOR (SOLARIS - UNIX)

   [...]
   struct participante datos;
   struct mensaje mens;
   [...]
 
        printf ("Esperando datos\n");
    // En primer lugar, pedimos los datos
    if ((recv (s,(void *)&datos,sizeof(struct participante),0))==-1) {
        printf ("ERROR\n");
        exit (1);
    }
 
    printf ("Datos del usuario: %ld, %s, %s\n",datos.dni,datos.nick,datos.email);

    wait_(0);
    strncpy (mens.panel,panel_actual,100);
    if ((send (s,(void *)&mens,sizeof(struct mensaje),0)) == -1) {
        printf ("Error al enviar el panel\n");
        eliminar_recursos();
        signal_(0);
        exit(1);
    }

   
    printf ("PANEL ENVIADO\n");
    eliminar_recursos();
    exit(0);



Código:


   // CÓDIGO DEL CLIENTE (WINDOWS)

   [...]
   struct participante datos;
   struct mensaje mens;
   [...]

       printf ("DNI --> ");
    scanf ("%ld",&datos.dni);
    fflush (stdin);
    printf ("Nick --> ");
    gets (datos.nick);
    fflush (stdin);
    printf ("E-mail --> ");
    gets (datos.email);
   
    printf ("Datos: %ld -- %s -- %s\n\n",datos.dni,datos.nick,datos.email);
   
    if ((send (socket_inf.sock, (void *)&datos,sizeof(struct participante),0)) == SOCKET_ERROR) {
        printf ("ERROR al enviar datos.\n\n");
        exit (1);
    }
 
    if ((recv(socket_inf.sock, (void *)&mens, sizeof(struct mensaje), 0)) == SOCKET_ERROR) {
        printf ("ERROR al recibir el panel.\n\n");
        WSACleanup();
        exit(1);
    }




En ambos casos, las estructuras "mensaje" y "participante" son las siguientes:

Código:


struct participante {
   long dni;
   char nick[21];
   char email[51];
};

struct mensaje {
   int tipo;
   char panel[101];
   char coordenadas[3];
   char puntuaciones[300];
   char mensaje[100];
};



En los trozos de código vemos que primero Windows le envía a Unix datos del tipo "participante" y luego Unix le envía a Windows datos del tipo "mensaje".

Sin embargo, nos da problemas porque unas veces da error el envío y otras envía basura (la conexión no nos da ningún error, solo es el envío de mensajes).

¿A alguien se le ocurre cómo solucionarlo? Un saludo:

Yarblek de Logh

Pd: Las funciones wait_(int), signal_(int) y eliminar_recursos() son funciones personales.
Volver arriba
_Leo_



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

MensajePublicado: 12/12/2005 5:21 pm
Título:

Si querés enviarme el código, lo puedo probar y ver que ocurre.
_________________
_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 5:04 am
Título:

¿Haces las conversiones del tipo htons o ntohs?

Ese puede ser tu problema. Mira algun ejemplo en la red del uso de estas funciones.
Volver arriba
holylance



Registrado: 03 Ene 2006
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 07/02/2006 7:12 am
Título:

como bien dijo la person que estaba antes que yo, no sera un problema de compatbilidad de como interpretan los datos las máquinas cuando los envias y recibis, no conviene ponerlos en un formato canónico o algo así?
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