xxyyzz886
xxyyzz886
2018-12-04 16:35

【C++】网络程序,主机数过多时,发送命令引起内存急速增加问题望解答。

80
  • c++
  • 网络
  • sizeof
  • 内存

客户端使用了Iocp模型,当主机数量只有几个时,发送命令正常,内存占用正常,,
当主机数量超过1000时,
发送SendMsg时,前几次不会出问题,但当连续多次SendTest,客户端程序内存成倍急剧增加,本来占用十几M的程序,,会一直增加到好几百M直至崩溃..

以下是核心代码..
求解答原因。。谢谢大神们。。。

bool CIocpModeSvr::SendMsg(SOCKET sClient,char * pData,unsigned long Length) //使用Iocp发送
{
if(sClient==INVALID_SOCKET || pData==NULL || Length==0 || !IsStart)return false;

//申请操作键
PPER_IO_OPERATION_DATA PerIoData=(PPER_IO_OPERATION_DATA) \
                                  GlobalAlloc(GPTR,
                                  sizeof(PER_IO_OPERATION_DATA));

//准备缓冲
unsigned long  Flag=0;
DWORD SendByte;
ZeroMemory(&(PerIoData->OverLapped),sizeof(OVERLAPPED));
memcpy(PerIoData->Buf,pData,Length);
PerIoData->DataBuf.buf=PerIoData->Buf;
PerIoData->DataBuf.len=Length;
PerIoData->OperType=SEND_POSTED;
int bRet=WSASend(sClient,
                 &(PerIoData->DataBuf),
                 1,
                 &SendByte,
                 Flag,
                 &(PerIoData->OverLapped),
                 NULL);
if(bRet==SOCKET_ERROR && GetLastError()!=WSA_IO_PENDING)
{
    return false;
}
else return true;

return false;

}

typedef struct THEAD
{

DWORD id;
char data[2048];

}THEAD;

int MyDlg::SendTest()
{
THEAD head;
head.id=TOKEN_SEND; //命令标识
int n=m_OnlineList.GetItemCount(); //获取主机数量
for(int i=0;i {
SOCKET pClient = m_OnlineList.GetItemData(i);
if(m_pIocpServer->SendMsg(pClient,(char*)&head,sizeof(THEAD)))
{
m_OnlineList.SetItemText(i,2,"发送成功");
}
}
return 0;
}

//////////////服务端接收///////////////////
char Buffer[2048];
void ConnectClient()
{
THEAD head;
memcpy(&head,Buffer,sizeof(_THEAD_));

switch(head.id)
{
case TOKEN_OK:
{
//暂用
}
case TOKEN_SEND:
{
MessageBox(NULL,"发送成功","",NULL); //看看命令是否到达
break;
}
}

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答