免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: qingfengjianke
打印 上一主题 下一主题

一个udp服务程序占用cpu过高的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-06-12 22:26 |只看该作者

回复 #10 cookis 的帖子

下面是我帮你改过后的,cpu使用率只有0.1%
#include   <unistd.h>   
#include   <arpa/inet.h>   
#include   <stdio.h>   
#include   <stdlib.h>   
#include   <string.h>   
#include   <sys/types.h>   
#include   <sys/socket.h>
#include   <sys/wait.h>   
#include   <netinet/in.h>   
#include   <mysql/mysql.h>   
#include   <signal.h>   
#include   <errno.h>   
#include   <syslog.h>
#include   <time.h>
  
#define MAX 0
int main()
{
    int opt =1;
    int clifd;
    int sockSrv = socket(AF_INET,SOCK_DGRAM,0);
     //setsockopt(sockSrv, SOL_SOCKET, SO_REUSEADDR, (const void*)&opt, sizeof(opt));

    struct  sockaddr_in addrSrv;
    addrSrv.sin_addr.s_addr=htonl(INADDR_ANY);//............

    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(888;//...........

    bind(sockSrv,(struct sockaddr*)&addrSrv,sizeof(addrSrv));
    char recvBuf[100];
    char sendBuf[100];
    char tempBuf[100];
    struct sockaddr_in addrClient;
    int len = sizeof(struct sockaddr);
    printf(".......!!!\n";
    struct timeval tv;
   
    while(1)
    {
        tv.tv_sec=1;
        tv.tv_usec=0;
        fd_set fdsocket;
        FD_ZERO(&fdsocket);
        FD_SET(sockSrv,&fdsocket);
        if(select(sockSrv+1,&fdsocket,NULL,NULL,&tv))
        {
            if(FD_ISSET(sockSrv,&fdsocket))
            {
                recvfrom(sockSrv,recvBuf,100,0,(struct sockaddr*)&addrClient,(socklen_t *)&len); //......

            /*    if('q' == recvBuf[0])
                {
                    sendto(sockSrv,"q",strlen("q"+1,0,(sockaddr*)&addrClient,len);
                    printf("Chat end!\n";
                    break;
                }   
                sprintf(tempBuf,"%s . : %s",inet_ntoa(addrClient.sin_addr),recvBuf);
                printf("%s\n",tempBuf);
                printf("...:";
                gets(sendBuf);
                sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrClient,len);*/
            }
        
        }
    }
    close(sockSrv);
    return 0;
}

论坛徽章:
0
22 [报告]
发表于 2008-06-13 06:20 |只看该作者
LS的没错,LZ需要重新读Linux select() manpage,特别是关于timeout参数

论坛徽章:
0
23 [报告]
发表于 2008-06-13 10:36 |只看该作者
原帖由 qingfengjianke 于 2008-3-28 17:49 发表
#include      
&nbsp;&nbsp;#include      
&nbsp;&nbsp;#include      
&nbsp;&nbsp;#include      
&nbsp;&nbsp;#include      
&nbsp;&nbsp;#include      
&nbsp;&nbsp;#include   
#include   
...


while(1) { sleep(1);}

while(1) { usleep(1000);}

需要sleep的

论坛徽章:
0
24 [报告]
发表于 2008-12-05 15:28 |只看该作者
if(select(sockSrv + 1,  &fdsocket, NULL, NULL, NULL))

论坛徽章:
0
25 [报告]
发表于 2008-12-05 15:38 |只看该作者
或者
先把套接字设置为非阻塞模式
int flags;
flags =  fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
然后
select

论坛徽章:
0
26 [报告]
发表于 2008-12-05 15:40 |只看该作者
原帖由 qingfengjianke 于 2008-3-31 09:11 发表



   Thankes!


  这么老的帖子了 还给顶出来了,

参见cookies 兄的法子 ,问题已经解决.

论坛徽章:
0
27 [报告]
发表于 2009-07-07 12:41 |只看该作者
肯定是select的问题,select 在不停的循环,导致一个核的cpu消耗光了

论坛徽章:
0
28 [报告]
发表于 2009-07-07 12:57 |只看该作者
原帖由 ty263 于 2009-7-7 12:41 发表
肯定是select的问题,select 在不停的循环,导致一个核的cpu消耗光了


挖坟啊~~

论坛徽章:
0
29 [报告]
发表于 2009-07-07 13:03 |只看该作者
是不是用select把进程给阻塞了,让出CPU阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP