📄 writerudp.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 + -