高手看看以下代码有什么问题,我运行程序后占用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;
}

解决方案 »

  1.   

    恕我眼拙,没看出来内存泄漏。
    并且问LZ,到底是内存泄漏了还是CPU占用率高了?
      

  2.   

    问题不在这应该
    cpu占用的多不是内存泄漏,
    if(iRecLen==SOCKET_ERROR||iRecLen <=0||iRecLen!=length) 
    这句话相当冗余
    if(iRecLen!=length)就可以了
      

  3.   


    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并不一定能一次把包接收完,可能要分几次接收,完后组包。
    还有就是如果收包太频繁的话,对系统可能会有影响,因为你的内存分配和释放太频繁了,建议你实现
    一个内存缓冲池。
    其他的就没有看错什么问题了
      

  4.   

    这个函数时在一个单独线程调用的,cpu占用太多一般是什么问题?多线程?
      

  5.   

    这段代码没有内存泄露,这段代码也不会引发CPU占用过高,CPU占用过高是别的原因,找其他地方的代码原因。
      

  6.   

    sleep(100)一下
    且最好放在一个独立线程中去接受数据包
      

  7.   

    看不出有什么问题,应该是recvfrom阻塞导致的cpu占用率高
      

  8.   


    如何设置recvfrom为非阻塞?