免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2385 | 回复: 7
打印 上一主题 下一主题

[C++] 麻烦各位帮分析下面代码为何让CPU飙升%100 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-07 14:59 |只看该作者 |倒序浏览
/*******************************************************
*        SIB300
*                TCP端口监听构件
*
          *        Parameters
          *                buf          数据包
          *                int     数据包长度
          *        Return value
          *                0<                调用失败
          *                =0                函数调用成功
          *
*******************************************************/
SIBLIB_API int SIB300(char  *buf,int len)
{
  
    int nfds;
    fd_set  rfds,oldfds;
    int childpid;
   
    int Index;
    int ret,i;
    int nProtocol = 1;
    int m_ServerSock;

   #ifndef HPUNIX
         int socketaddrLen;
  #else
   // int socketaddrLen;
     socklen_t socketaddrLen;
  #endif
   
   
    struct sockaddr_in client;
   
   
        int forktype;//0:进程,1:线程
        char tempbuf[256];
        char m_buf[256];
        int value,value1,valueport,valueip;


        int dccListenPort=9811;
   
    unsigned char abuf[5];
   
    int lsock=0;
    int lsock1=0;
    int PortSetLength=0;

        int CurrNum;
        struct   PortProtocol PortSet[SEVERMAX];//监听端口数
        int      n_lsock[SEVERMAX];//socket句柄
   
        //转换为内部结构
        User_Data        *pUsrData;;
        pUsrData=(struct UserData *)buf;

   
        forktype=atoi(pUsrData->Script.line.FileName );
       
        valueip=atoi(pUsrData->Script.line.Para[4])-1;


        value=atoi(pUsrData->Script.line.Para[2])-1;
        value1=atoi(pUsrData->Script.line.Para[3])-1;
        if(value<0 || value>MAXUNUM || value1<0 || value1>MAXUNUM)
        {
       
                                baseDelSpace(pUsrData->Script.line.Content);
                                for(i=0;i<10;i++)
                                {
                                        memset(tempbuf,0,sizeof(tempbuf));
                                        memset(m_buf,0,sizeof(m_buf));
                                        baseGetParaMid(i+1,pUsrData->Script.line.Content,tempbuf,';');
                                        if(tempbuf[0]==0 && i==0)//第一次不能为空
                                        {
                                                CurrNum=atoi(pUsrData->Script.line.Para[0]);
                                                pUsrData->Script.CurrNum=CurrNum;
                                                printf("Content为空%d\n",CurrNum);

                                                pUsrData->Work.thirdStep=USER_PROCCESS_WAIT;
                                                buf=(char*)pUsrData;
                                                return 1;

                                        }
                                        if(tempbuf[0]==0)
                                        {
                                                break;
                                        }
                                        baseGetPara(1,tempbuf,m_buf);
                                        PortSet.Port=atoi(m_buf);
                                        printf("端口号%d 序号%d\n",atoi(m_buf),i);
                                        PortSet.Protocol =atoi(m_buf);


                                        baseGetPara(2,tempbuf,m_buf);
                                        strcpy(PortSet.ScriptName ,m_buf);
                                        printf("脚本名%s 序号%d\n",m_buf,i);
                                        PortSetLength=i+1;
                               

                                }
        }else
        {
                        PortSet[0].Port=pUsrData->Script.Value[value];
                        memcpy(PortSet[0].ScriptName,pUsrData->Script.UserString[value1],sizeof(PortSet[0].ScriptName));
                        PortSetLength=1;
                        printf("脚本名%s 端口%d\n",PortSet[0].ScriptName,PortSet[0].Port);
        }
        printf("TCP监听端口总数%d\n",PortSetLength);
   

        printf("配置收到连接请求时创建方式%d\n",forktype);
        valueport=atoi(pUsrData->Script.line.Para[1])-1;
        if(valueport<0 || valueport>MAXUNUM)
        {
                        CurrNum=atoi(pUsrData->Script.line.Para[0]);
                        pUsrData->Script.CurrNum=CurrNum;
                        printf("变量序号错误P1 %d\n",valueport);

                        pUsrData->Work.thirdStep=USER_PROCCESS_WAIT;
                        buf=(char*)pUsrData;
                        return 1;                 
        }else
        {
                        printf("保存socket变量序号为=%d\n",valueport+1);
        }


    //  FD_ZERO(&rfds);
    //  FD_ZERO(&oldfds); //为了防止引用时被修改
    memset(&rfds, 0, sizeof(rfds));
    memset(&oldfds, 0, sizeof(oldfds));

        int m_PortCount=0;
        for(i=0;i<PortSetLength;i++)
        {
                lsock=V_ServerSock(PortSet.Port);
                if(lsock>0)
                {
                        lsock1=lsock;
                        n_lsock[m_PortCount] = lsock;
                        m_PortCount++;
                        FD_SET(lsock,&oldfds); //为了防止lsock发生变化引入lsock1
                }
                else
                {
                        printf("端口绑定错误 Port = %d\n",PortSet.Port);
                        //是否要跳转到失败处
                        CurrNum=atoi(pUsrData->Script.line.Para[0]);
                        pUsrData->Script.CurrNum=CurrNum;
                        printf("goto %d\n",CurrNum);

                        pUsrData->Work.thirdStep=USER_PROCCESS_INIT;
                        buf=(char*)pUsrData;
                        return 1;
                }
        }


  
    lsock = lsock1;
    nfds = lsock+1;
   
    printf("TCP监听开始...........\n");
    struct timeval        timev;
    memset(&timev, 0, sizeof(struct timeval));
    timev.tv_sec =30;

    while(1)
    {
        usleep(10000);
        rfds = oldfds;
        if(select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)&timev) < 0)
        {
            thr_sleep(0,10);
            continue;
        }
        
      
               
                Index = -1;
                for(i=0;i<m_PortCount;i++)
                {
                        if(FD_ISSET(n_lsock,&rfds))
                           Index = i;
                }
                if(Index <0 || Index>SEVERMAX)
                {
                        thr_sleep(0,10);
                        continue;
                }
       


        socketaddrLen =(socklen_t)sizeof(struct sockaddr_in);
        
//        if((m_ServerSock = accept(n_lsock[Index], (struct sockaddr *)&client,(socklen_t*)&socketaddrLen)) == -1)
        if((m_ServerSock = accept(n_lsock[Index], (struct sockaddr *)&client,(int*)&socketaddrLen)) == -1)
        {//*ERROR
            thr_sleep(0,10);
            continue;
        }
#ifdef WIN32
        BOOL opt = true;
        ret = setsockopt(m_ServerSock, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(BOOL));
#else
        int opt = 1;
        ret = setsockopt(m_ServerSock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int));
#endif
        memcpy(abuf,&client.sin_addr.s_addr,4);
        printf("连接ip=[%d.%d.%d.%d]地址 scoket=%d\n",abuf[0],abuf[1],abuf[2],abuf[3],m_ServerSock);
               
                if(valueip>0 && valueip<MAXSTRNUM)
                {
                        sprintf(pUsrData->Script.UserString[valueip],"%d.%d.%d.%d.%d",abuf[0],abuf[1],abuf[2],abuf[3]);
                }
      

        
             int nPort = PortSet[Index].Port;
                nProtocol = PortSet[Index].Protocol;
                int nMode =  PortSet[Index].Mode;
                 
        
#ifndef  WIN32
                 if(forktype == 0 )
                 {
                                 printf("启动进程\n");
                              errno = 0;
                               while ((childpid = fork()) < 0)
                                {
                                            if (errno==EINTR||errno==EAGAIN)
                                            {
               
                                                           sleep(1);
                                                                continue;
                                                   }       
                                                         else
                                                         {
                                                                perror("fork err\n");
                                                                errno=0;
                                                                close(n_lsock[Index]);
                                                                close(m_ServerSock);               
                                                                exit(1);
                                                         }
                                        }
        
                                        if (childpid == 0)
                                        {
                                                close(n_lsock[Index]);
                                                pUsrData->Script.Value [valueport]=m_ServerSock;

                                                buf=(char*)pUsrData;
                                                //把TCP句柄传进去
                                                if (pUsrData->SCP_ServiceProcess(PortSet[Index].ScriptName,buf,len)<0)
                                                {
                                                        printf("SCP_ServiceProcess() < 0\n");
                                                                
                                                }
                                                close(m_ServerSock);   
                                                exit(0);
                                        }
                                        close(m_ServerSock);
                                        continue;
                }else
                 {
                        ThreadParm m_param;
                       
                        m_param.socket_fd=m_ServerSock;
                        //保存socket 句柄的整行变量序号
                        pUsrData->Script.Value [valueport]=m_ServerSock;                         
                        printf("启动为线程 socket=%d\n",m_ServerSock,valueport);
                        m_param.p1=nPort;
                        m_param.p2 =nProtocol;
                        strcpy(m_param.FileName,PortSet[Index].ScriptName);
                        memcpy(&m_param.m_UserData,pUsrData,sizeof(User_Data));
                        SRegActvTskH(m_param);
                        continue;   
                }
#else       
                        ThreadParm m_param;
               
                        m_param.socket_fd=m_ServerSock;
               
                        //保存socket 句柄的整行变量序号
                        pUsrData->Script.Value [valueport]=m_ServerSock;                         
                        printf("启动为线程 socket=%d\n",m_ServerSock,valueport);
                        m_param.p1=nPort;
                        m_param.p2 =nProtocol;
                        strcpy(m_param.FileName,PortSet[Index].ScriptName);

                        memcpy(&m_param.m_UserData,pUsrData,sizeof(User_Data));
               
                        SRegActvTskH(m_param);
                        continue;   
      
#endif      
        
       }
          
      
                CurrNum=atoi(pUsrData->Script.line.Para[0]);
                pUsrData->Script.CurrNum=CurrNum;
                printf("goto %d\n",CurrNum);
                pUsrData->Work.thirdStep=USER_PROCCESS_INIT;
                buf=(char*)pUsrData;
       return 1;
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-07-07 15:01 |只看该作者
主要是格式太乱,导致编译器生成的目标代码质量下降引起的。

论坛徽章:
0
3 [报告]
发表于 2009-07-07 17:18 |只看该作者

回复 #2 flw 的帖子

鼠标滚了n下

论坛徽章:
0
4 [报告]
发表于 2009-07-07 17:24 |只看该作者

回复 #1 baiseqiji 的帖子

楼主,整理下代码,别这样写。搞得人头晕眼花,还哪有能力看下去。
不过,小弟头晕眼花可能跟中午只喝了一碗粥有关,有可能不是楼主这段代码导致。

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2009-07-07 17:31 |只看该作者
原帖由 baiseqiji 于 2009-7-7 14:59 发表
/*******************************************************
*        SIB300
*                TCP端口监听构件
*
          *        Parameters
          *                buf          数据包
          *                int     数据包长度
          *        Retur ...


LZ改改帖子,把代码放在[code][/code]中,这样方便察看

论坛徽章:
0
6 [报告]
发表于 2009-07-07 21:49 |只看该作者
给两个注释也好

论坛徽章:
0
7 [报告]
发表于 2009-07-08 10:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2009-07-08 12:50 |只看该作者
while(1)
    {
        usleep(10000);
        rfds = oldfds;
        if(select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)&timev) < 0)

在select前面重设置timev
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP