⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 writerudp.cpp

📁 symbian平台S60_2nd_FP2_SC rtp实现
💻 CPP
字号:

#include "writerudp.h"
#include "socketsenginenotifier.h"

CWriterUdp* CWriterUdp::NewL(MSocketsEngineNotifier& aEngineNotifier, RSocket& aSocket)
{
	CWriterUdp* self = new (ELeave) CWriterUdp(aEngineNotifier, aSocket);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
}

CWriterUdp::CWriterUdp(MSocketsEngineNotifier& aEngineNotifier, RSocket& aSocket)
: CActive(EPriorityStandard),
  iSocket(aSocket),
  iEngineNotifier(aEngineNotifier)
{
}

CWriterUdp::~CWriterUdp()
{
    Cancel();
	if (iTransferBuffer)
	{
		delete iTransferBuffer;
		iTransferBuffer = NULL;
	}
}

void CWriterUdp::DoCancel()
{	
	if(iSocket.SubSessionHandle())
		iSocket.CancelWrite();
}

void CWriterUdp::ConstructL()
{
	CActiveScheduler::Add(this);
	iTransferBuffer = NULL;
	iWriteStatus = EWaiting;
}

void CWriterUdp::RunL()
{
	if (iStatus == KErrNone)
	{
		switch(iWriteStatus)
		{
		case ESending:
            SendNextPacket();
			break;
		default:
			break;
		};
	}
    else 
	{
        iEngineNotifier.ReportError(MSocketsEngineNotifier::EGeneralWriteError, iStatus.Int());
        iWriteStatus = EWaiting;
	}
}

void CWriterUdp::IssueWriteL(const NetworkAddress& DestAddress,TDesC8& aData, TBool bIssueNow)
{
    if (!(iWriteStatus == EWaiting || iWriteStatus == ESending))
    {
        User::Leave(KErrNotReady);
    }

	if (iTransferBuffer) {
		delete iTransferBuffer;
		iTransferBuffer = NULL;
	}
	iTransferBuffer = HBufC8::New(1024);
	CleanupStack::PushL(iTransferBuffer);

    if ((aData.Length() + iTransferBuffer->Des().Length()) > iTransferBuffer->Des().MaxLength())
    {
        User::Leave(KErrOverflow);
	}
	iTransferBuffer->Des().Append(aData);
	iTransferBuffer->Des().ZeroTerminate();
	
	//
	TBuf<32> aIP;
	DestAddress.Address.Output(aIP);
	udpAddr.Input(aIP);
	TInt aPort =DestAddress.Address.Port();
	udpAddr.SetPort(aPort);

	if(bIssueNow)
	{
		SendNextPacket();
	}
	CleanupStack::Pop();
}

void CWriterUdp::SendNextPacket()
{
	if (iTransferBuffer->Des().Length() > 0) //一直到数据发送完毕,完毕后停止
	{
		if(IsActive()) 
		{
			Cancel();
		}
		iWriteBuffer.Copy(iTransferBuffer->Des());
		iWriteBuffer.ZeroTerminate();
		iTransferBuffer->Des().Zero();
		
		if(iSocket.SubSessionHandle())
			iSocket.SendTo(iWriteBuffer, udpAddr, 0, iStatus, iXfrLen);
		iWriteStatus = ESending;
		if(!IsActive())
			SetActive();
	}
	else
	{
		iWriteStatus = EWaiting;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -