您的位置:首页 > 编程语言 > C语言/C++

C++第三方库HPSocket数据的发送与接收

2017-07-27 10:15 791 查看

发送数据

CString bodyDesc;
m_Content.GetWindowText(bodyDesc);
SendData2("怪兽乐园", 23, bodyDesc);
void CClientDlg::SendData2(LPCSTR bodyName, short bodyAge, CString bodyDesc)
{
static DWORD SEQ = 0;
USES_CONVERSION;

LPCSTR name = bodyName;
LPCSTR desc = T2A((LPCTSTR)bodyDesc);
int desc_len = (int)strlen(desc) + 1;
int body_len = offsetof(TPkgBody, desc) + desc_len;

TPkgBody* pBody = (TPkgBody*)_alloca(body_len);
memset(pBody, 0, body_len);

pBody->age = bodyAge;
strcpy(pBody->name, name);
strcpy(pBody->desc, desc);

TPkgHeader header;
header.seq = ++SEQ;
header.body_len = body_len;

WSABUF bufs[2];
bufs[0].len = sizeof(TPkgHeader);
bufs[0].buf = (char*)&header;
bufs[1].len = body_len;
bufs[1].buf = (char*)pBody;

if (m_Client->SendPackets(bufs, 2))  //发送多组数据(2组)
::LogSend(m_Client->GetConnectionID(), bodyDesc);
else
::LogSendFail(m_Client->GetConnectionID(), ::SYS_GetLastError(), ::HP_GetSocketErrorDesc(SE_DATA_SEND));
}



接收数据

EnHandleResult CServerDlg::OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength)
{
TPkgInfo* pInfo = FindPkgInfo(pSender, dwConnID);
ITcpPullServer* pServer = ITcpPullServer::FromS(pSender);

if (pInfo != nullptr)
{
int required = pInfo->length;
int remain = iLength;

while (remain >= required)
{
remain -= required;
CBufferPtr buffer(required);

EnFetchResult result = pServer->Fetch(dwConnID, buffer, (int)buffer.Size());
if (result == FR_OK)
{
if (pInfo->is_header)
{
TPkgHeader* pHeader = (TPkgHeader*)buffer.Ptr();
//TRACE("[Server] head -> seq: %d, body_len: %d\n", pHeader->seq, pHeader->body_len);

required = pHeader->body_len;
}
else
{
TPkgBody* pBody = (TPkgBody*)(BYTE*)buffer;

char *ch = pBody->name;
int num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);
//获得长字节所需的空间
wchar_t *wide = new wchar_t[num];
MultiByteToWideChar(0, 0, ch, -1, wide, num);
m_Info.AddString(wide);   //在控件中显示name

itoa(int(pBody->age), ch, 10);   //将int转换为char*
num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);
//获得长字节所需的空间
wide = new wchar_t[num];
MultiByteToWideChar(0, 0, ch, -1, wide, num);
m_Info.AddString(wide);  //在控件中显示age

ch = pBody->desc;
num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);
//获得长字节所需的空间
wide = new wchar_t[num];
MultiByteToWideChar(0, 0, ch, -1, wide, num);
m_Info.AddString(wide); //在控件中显示desc

//TRACE("[Server] body -> name: %s, age: %d, desc: %s\n", pBody->name, pBody->age, pBody->desc);

required = sizeof(TPkgHeader);
}

pInfo->is_header = !pInfo->is_header;
pInfo->length = required;

::PostOnReceive(dwConnID, buffer, (int)buffer.Size());

if (!pSender->Send(dwConnID, buffer, (int)buffer.Size()))  //发送数据
return HR_ERROR;
}
}
}

return HR_OK;
}
TPkgInfo* CServerDlg::FindPkgInfo(ITcpServer* pSender, CONNID dwConnID)
{
 PVOID pInfo = nullptr;
 pSender->GetConnectionExtra(dwConnID, &pInfo); //获取连接的附件数据 return (TPkgInfo*)pInfo;
}

自定义类型

struct TPkgHeader
{
DWORD seq;
int body_len;
};

struct TPkgBody
{
char name[30];
short age;
char desc[1];
};
struct TPkgInfo
{
 bool is_header;
 int length;
 TPkgInfo(bool header = true, int len = sizeof(TPkgHeader)) : is_header(header), length(len) {}
 void Reset() {is_header = true, length = sizeof(TPkgHeader);}
 ~TPkgInfo() {}
};

代码源自HPSocket的demo,略有修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐