[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;
}
留言列表