3. Función de desempaquetamiento de estructuras

Como vemos la función smpp34_unpack( ... ) toma cuatro parámetros y retorna un valor entero que describe el resultado de la operación. Un valor distinto de 0 en el retorno, indica que hubo un error en el intento de desempaquetado, luego hay una descripción en modo texto en la variable global smpp34_strerror.

extern int smpp34_errno;
extern char smpp34_strerror[2048];

int smpp34_unpack( uint32_t type,   /* in  */
                   void    *tt,     /* out */
                   uint8_t *ptrBuf, /* in  */
                   int     ptrLen,  /* in  */ )
    
Donde:

type: es el command_id del PDU que se quiere desempacar, el valor de este parámetro esta directamente relacionado a una estructura de datos específica.

tt: Es un puntero a una de las estructuras de datos listadas en la introducción y que se corresponde con el valor del primer parámetro. El puntero a dicha esctructura describe donde va a volcare el contenido del buffer.

ptrBuf: es un puntero a un buffer, donde va a almacenado el PDU empacado.

ptrLen: en esta variable va el largo del buffer anteriormente descripto.

3.1. Ejemplo de uso

Se detalla a continuación un pequeño ejemplo de uso, en el mismo, se detalla la creación de un buffer con data binaria. Luego se aplica la función de desempacado y se carga una estructura de datos con la data.

Ejemplo 2. Ejemplo de unpack y dumpPdu.

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <netinet/in.h>
#include "smpp34.h"
#include "smpp34_structs.h"
#include "smpp34_params.h"

char bufPDU[] = { 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
                  0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x5F, 0x69, 
                  0x64, 0x00, 0x70, 0x61, 0x73, 0x73, 0x00, 0x73, 
                  0x79, 0x73, 0x74, 0x65, 0x00, 0x00, 0x02, 0x01, 
                  0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5F, 
                  0x72, 0x61, 0x6E, 0x67, 0x65, 0x00 };

int  bufPDULen = 0;
char bPrint[2048];

    int
main( int argc, char *argv[] )
{

    int  ret = 0;
    bind_receiver_t pdu;
    uint32_t tempo;
    uint32_t cmd_id;

    /* Init PDU ***********************************************************/
    memset(&pdu, 0, sizeof(bind_receiver_t));
    memset(&bPrint, 0, sizeof(bPrint));
    memcpy(&tempo, bufPDU+4, sizeof(uint32_t));
    cmd_id = ntohl( tempo );

    /* unpack PDU *********************************************************/
    ret = smpp34_unpack(cmd_id, (void*)&pdu, bufPDU, sizeof(bufPDU));
    if( ret != 0){
        printf( "Error in smpp34_unpack():%d:%s\n",
                smpp34_errno, smpp34_strerror);
        return( -1 );
    };

    /* Print PDU **********************************************************/
    memset(bPrint, 0, sizeof(bPrint));
    ret = smpp34_dumpPdu(cmd_id, bPrint, sizeof(bPrint), (void*)&pdu );
    if( ret != 0){
        printf( "Error in smpp34_dumpPdu():%d:%s\n",
                smpp34_errno, smpp34_strerror );
        return( -1 );
    };
    printf("El PDU recibido es: \n%s\n", bPrint);

    return( 0 );
};

    
Por último, este mismo ejemplo nos va a servir en la descripción de la función smpp34_dumpPdu( ... ) .

El ejemplo se compila y ejecuta:

[rtremsal@localhost dist]$ gcc -o ll ll.c -I ./include -static -L ./lib -lsmpp34
[rtremsal@localhost dist]$ ./ll
El PDU recibido es: 
command_length                [00000036] - [54]
command_id                    [00000001] - [BIND_RECEIVER]
command_status                [00000000] - [ESME_ROK]
sequence_number               [00000001] - [1]
system_id                     [system_id]
password                      [pass]
system_type                   [syste]
interface_version             [00]       - [0]
addr_ton                      [02]       - [TON_National]
addr_npi                      [01]       - [NPI_ISDN_E163_E164]
address_range                 [address_range]