xxyyzz886 2018-12-04 16:35 采纳率: 50%
浏览 497
已结题

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

客户端使用了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条回答 默认 最新

  • 潭溪Zerg 2018-12-05 02:01
    关注

    PerIoData->DataBuf这个数组空间你创建复制数据后,没有释放就离开了,肯定每发送一次就多吃掉一些内存啊
    返回后先不判断,先把这个内存释放吧,delete PerIoData->DataBuf

    评论

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题