Compartilhar via


WAP API Sample for User Data at the WDP Layer

Windows Mobile SupportedWindows Embedded CE Supported

9/19/2008

O seguinte exemplo de código ilustra como enviar e ler um primitivo com dados usuário por meio WDP_LAYER. A codificar usa um dispositivo como tanto o iniciador e respondedor. Essas duas funções são diferenciadas por meio de portas diferentes.

Observação

Se os elementos estrutura não forem corretamente inicializado, o WAP API retorna o erro 0 x 80070057, "o parâmetro está incorreto".

#include <windows.h>
#include <wap.h>

//  Use UDP bearer if bUDP = true, Use SMS bearer if bUDP = false;
bool WdpSendAndReadEcho( bool bUDP ) 
{

    bool bSendReadOK = false;

    HRESULT hResult;

    //  Open WAP for Sending WDP UnitData
    const WAP_LAYER wlLayer = WAP_LAYER_WDP;
    const DWORD dwSendPort = 3000L;
    WAP_HANDLE hWapSend = 0L;
    HANDLE hWapSendMsgEvent= NULL;

    //  Open WAP for reading WDP UnitData
    const DWORD dwRecvPort = 3001L;
    WAP_HANDLE hWapRecv= 0L;
    HANDLE hWapRecvMsgEvent = NULL;

    //  Create WDP UnitData structure with user data
    WAP_ADDRESS waSendRecv;
    const TCHAR *const tszIpLoopbackAddr = _T("127.0.0.1");// For UDP bearer
    const TCHAR *const tszTelNum = _T("8009352663");   // Sample Phone number, used for SMS bearer

    WDP_UNITDATA Wdpunitdata;

    DWORD dwWdpRecvDataSize = 0L;
 
    WDP_UNITDATA *pcbWdpRecvData = NULL;
 
    // Use temporary buffer because pbUserData is const BYTE * 
    BYTE *pbBuffer = NULL;

    hResult = WapOpen( wlLayer, dwSendPort, &hWapSend, &hWapSendMsgEvent );
    if ( FAILED(hResult) || !hWapSend || !hWapSendMsgEvent  ) 
    {
        OutputDebugString( _T("WapOpen() for sending WDP UnitData failed") );
        hWapSend = 0L;
        hWapSendMsgEvent= NULL;
        return false;
    }

    hResult = WapOpen( wlLayer, dwRecvPort, &hWapRecv, &hWapRecvMsgEvent );
    if ( FAILED(hResult) || !hWapRecv || !hWapRecvMsgEvent ) 
    {
        OutputDebugString( _T("WapOpen() for reading WDP UnitData failed") );
        hWapRecv= 0L;
        goto exit_label;
    }

    if(bUDP)
    {

        _tcsncpy( waSendRecv.ptsAddress, tszIpLoopbackAddr, MAX_WAP_ADDRESS_LENGTH );
    }
    else
    {
        _tcsncpy( waSendRecv.ptsAddress, tszTelNum, MAX_WAP_ADDRESS_LENGTH);
    }

    waSendRecv.watAddressType = bUDP ? WAP_ADDRESS_TYPE_UDP : WAP_ADDRESS_TYPE_GSM_SMS;

    // Initialize the WDP UnitData
    memset( &Wdpunitdata, 0, sizeof(Wdpunitdata) );
    Wdpunitdata.wpiPrimitiveID = WAP_PRIMITIVE_ID_T_DUNITDATA;
    Wdpunitdata.wptPrimitiveType = WAP_PRIMITIVE_TYPE_REQUEST;
    Wdpunitdata.dwValidFields =  (WDP_FIELD_SOURCEADDRESS      |
                                  WDP_FIELD_SOURCEPORT         |
                                  WDP_FIELD_DESTINATIONADDRESS |
                                  WDP_FIELD_DESTINATIONPORT    |
                                  WDP_FIELD_USERDATA );
    Wdpunitdata.waSourceAddress =  waSendRecv;
    Wdpunitdata.dwSourcePort = dwSendPort;
    Wdpunitdata.waDestinationAddress = Wdpunitdata.waSourceAddress;
    Wdpunitdata.dwDestinationPort = dwRecvPort;
    // Set Random user data with size = 0x100
    Wdpunitdata.dwUserDataSize = 0x100;

    if(pbBuffer = new BYTE[Wdpunitdata.dwUserDataSize])
    {
    // Fill the user data section with random data
        for ( DWORD dw = 0; dw < Wdpunitdata.dwUserDataSize; dw++ ) 
        {
            pbBuffer[ dw ] = rand() % 0xFF;
        }
    }    
    else 
    {
        goto exit_label;
    }
    Wdpunitdata.pbUserData = pbBuffer;

    //  Send WDP Data
    hResult = WapSend( hWapSend, (WAP_PRIMITIVE_BASE *)&Wdpunitdata );
    if ( FAILED(hResult) ) 
    {
        OutputDebugString( _T("WapSend() with WDP Unitdata failed") );
        goto exit_label;
    }

    //  Wait for WAP message received Event
    if ( WAIT_OBJECT_0 != WaitForSingleObject( hWapRecvMsgEvent , 10000L ))
    {
        OutputDebugString( _T("Failed to wait for or timed out waiting for expected WDP Data") );
        goto exit_label;
    }

    hResult = WapGetNextPrimitiveSize( hWapRecv, &dwWdpRecvDataSize);
    if ( FAILED(hResult) || (0 == dwWdpRecvDataSize) ) 
    {
        OutputDebugString( _T("WapGetNextPrimitiveSize() failed") );
        goto exit_label;
    }

    //  Allocate memory for storing received WDP Data
    pcbWdpRecvData =( WDP_UNITDATA* ) new BYTE[ dwWdpRecvDataSize ];
    if ( !pcbWdpRecvData) 
    {
        OutputDebugString( _T("Failed to allocate memory for storing WDP Unit Data") );
        goto exit_label;
    }

    //  Read WDP Data
    hResult = WapRead( hWapRecv, (WAP_PRIMITIVE_BASE *)pcbWdpRecvData, dwWdpRecvDataSize );
    if ( FAILED(hResult) ) 
    {
        OutputDebugString( _T("WapRead() failed") );
        goto exit_label;
    }

    // Validate the received primitive and
    // Compare the received user data to the sent user data
    if (!pcbWdpRecvData)
        goto exit_label;

    bSendReadOK = true;
    bSendReadOK &= (WAP_PRIMITIVE_ID_T_DUNITDATA == pcbWdpRecvData->wpiPrimitiveID);
    bSendReadOK &= (WAP_PRIMITIVE_TYPE_INDICATION == pcbWdpRecvData->wptPrimitiveType);
    bSendReadOK &= (pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEADDRESS ) && ( pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEPORT );
    bSendReadOK &= (pcbWdpRecvData->dwUserDataSize == Wdpunitdata.dwUserDataSize);
    if(bSendReadOK && pcbWdpRecvData->pbUserData)
    {
        bSendReadOK &= !memcmp(pcbWdpRecvData->pbUserData, Wdpunitdata.pbUserData, pcbWdpRecvData->dwUserDataSize);
    }
 
    exit_label:
    
    //  Close WAP  for Sending WDP UnitData
    if ( hWapSend) 
    {
        hResult = WapClose( hWapSend );
        if ( FAILED(hResult) ) 
        {
            OutputDebugString( _T("WapClose() for sending WDP UnitData failed") );
            bSendReadOK = false;
        } 
        else 
        {
            hWapSend = 0L;
        }
    }

    //  Close WAP  for Receiving WDP UnitData
    if ( hWapRecv ) 
    {
        hResult = WapClose( hWapRecv );
        if ( FAILED(hResult) ) 
        {
            OutputDebugString( _T("WapClose() for reading WDP UnitData failed") );
            bSendReadOK = false;
        } 
        else 
        {
            hWapRecv = 0L;
        }
    }
    // Clear the buffers
    if (pbBuffer) 
    {
        delete[] (BYTE*) pbBuffer;
        pbBuffer = NULL;
    }

    if ( pcbWdpRecvData ) 
    {
        delete [] (BYTE*) pcbWdpRecvData;
        pcbWdpRecvData = NULL;
    }

    return bSendReadOK;
}

See Also

Concepts

Wireless Application Protocol (WAP) API