客户端使用了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;
}
}