高手看看以下代码有什么问题,我运行程序后占用80%多的cpu:void CUDPServer::OnReceive(long length)
{
//length 是socket列队中的第一个报文长度
//在本函数中可以进行业务的处理
char *pbuf;
int addr_len,iRecLen;;
struct sockaddr_in addr;
pbuf = new char[length+1];
memset(pbuf,0,length+1);
addr_len = sizeof(addr);
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0||iRecLen!=length)
{
printf("Receive Failed!");
}
else
{
pbuf[length] = 0;
}
delete [] pbuf;
pbuf = NULL;
}
{
//length 是socket列队中的第一个报文长度
//在本函数中可以进行业务的处理
char *pbuf;
int addr_len,iRecLen;;
struct sockaddr_in addr;
pbuf = new char[length+1];
memset(pbuf,0,length+1);
addr_len = sizeof(addr);
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0||iRecLen!=length)
{
printf("Receive Failed!");
}
else
{
pbuf[length] = 0;
}
delete [] pbuf;
pbuf = NULL;
}
并且问LZ,到底是内存泄漏了还是CPU占用率高了?
cpu占用的多不是内存泄漏,
if(iRecLen==SOCKET_ERROR||iRecLen <=0||iRecLen!=length)
这句话相当冗余
if(iRecLen!=length)就可以了
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen <=0||iRecLen!=length)
{
printf("Receive Failed!");
}
else
{
pbuf[length] = 0;
} 这句话不正确,因为recvfrom并不一定能一次把包接收完,可能要分几次接收,完后组包。
还有就是如果收包太频繁的话,对系统可能会有影响,因为你的内存分配和释放太频繁了,建议你实现
一个内存缓冲池。
其他的就没有看错什么问题了
且最好放在一个独立线程中去接受数据包
如何设置recvfrom为非阻塞?