xxyyzz886
2018-12-04 16:35【C++】网络程序,主机数过多时,发送命令引起内存急速增加问题望解答。
80客户端使用了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条回答
为你推荐
- 【c++】为什么运行程序显示指令引用了0x内存,该内存不能为written
- c++
- 2个回答
- 求助 使用vs2017时用c++编写出现不是内部或外部命令,也不是可运行的程序 或批处理文件
- 批处理文件
- c++
- visual studio
- 9个回答
- 关于android触发C++程序的问题
- android
- c++
- 1个回答
- c++程序运行中断的问题
- c++
- 3个回答
- C/C++线程池问题,销毁线程时程序段出错
- namespace
- c++
- broadcast
- 线程
- 线程池
- 3个回答