close

 

[UDPServer.h]==========================================================

#ifndef UDPSERVER_H

#define UDPSERVER_H


#include <e32base.h> // For CActive, link against: euser.lib

#include <e32std.h> // For RTimer, link against: euser.lib


class UDPServer : public CActive

{

public:

UDPServer();

static UDPServer* NewL();

static UDPServer* NewLC();

virtual ~UDPServer();

void StartL();

private:

void ConstructL();

void RunL();

void DoCancel();

TInt RunError(TInt aError);

RSocketServ iSocketServ;

RSocket iSocket;

TSockAddr lAddress;

HBufC8* iBuffer;

TPtr8 iBufferPtr;

TRequestStatus iState;

};

#endif // UDPSERVER_H

 

 

[UDPServer.cpp]=======================================================

 

#include <es_sock.h> //get mobile IP

#include <in_sock.h>

#include <eikenv.h>

#include "UDPServer.h"

UDPServer::UDPServer():CActive(CActive::EPriorityStandard),iBufferPtr(0,0)

{

}

 

UDPServer::~UDPServer()

{

Cancel();

iSocket.Close();

iSocketServ.Close();

}

 

void UDPServer::ConstructL()

{

iBuffer = HBufC8::NewL(5001);

TPtr8 auxPtr(( TUint8* )iBuffer->Des().Ptr(), 1500);

iBufferPtr.Set( auxPtr );

User::LeaveIfError(iSocketServ.Connect());

CActiveScheduler::Add(this); 

}

 

UDPServer* UDPServer::NewL()

{

UDPServer* self = UDPServer::NewLC();

CleanupStack::Pop(self);

return self;

}

 

UDPServer* UDPServer::NewLC()

{

UDPServer* self = new (ELeave) UDPServer();

CleanupStack::PushL(self);

self->ConstructL();

return self;

}

 

void UDPServer::StartL()

{

User::LeaveIfError(iSocket.Open(iSocketServ, KAfInet, KSockDatagram, KProtocolInetUdp));

 

const TUint32 KInetAddr = INET_ADDR(0,0,0,0);

TInetAddr iLocalAddr;

iLocalAddr.SetPort(4404);

// iLocalAddr.SetFamily(KProtocolInetUdp);

 

User::LeaveIfError(iSocket.Bind(iLocalAddr)); 

CEikonEnv::Static()->InfoWinL(_L("Msg:"), _L("Here is StartL()"));

iSocket.RecvFrom(iBufferPtr, lAddress, 0, iStatus);

SetActive(); //Control never reaches RunL() of this AO

}

 

void UDPServer::RunL()

{

// lAddress.IsLinkLocal();

User::LeaveIfError(iStatus.Int());

if(!IsActive())

{

// deal with received data in iBufferPtr

CEikonEnv::Static()->InfoWinL(_L("Msg:"), _L("NatDebug1,line71"));

}

else

{

 

User::Leave(KErrInUse);

CActiveScheduler::Stop();

}

iSocket.RecvFrom(iBufferPtr, lAddress, 0, iStatus);

SetActive();

}

 

void UDPServer::DoCancel()

{

// cancel request

iSocket.CancelRecv();

}

 

TInt UDPServer::RunError(TInt aError)

{

TInt result = aError;

// see if it can recover from this error

if(aError == KErrCancel)

{

// not an error ... operation canceled

result = KErrNone;

}

// if not

// send notification to observer

// return the error code if not set to KErrNone in OnSignalChangeError

return result;

}

 

 

arrow
arrow
    全站熱搜

    NatPixnet 發表在 痞客邦 留言(0) 人氣()