免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 18122 | 回复: 28

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

论坛徽章:
0
发表于 2008-03-28 17:49 |显示全部楼层
#include   <unistd.h>   
&nbsp;&nbsp;#include   <arpa/inet.h>   
&nbsp;&nbsp;#include   <stdio.h>   
&nbsp;&nbsp;#include   <stdlib.h>   
&nbsp;&nbsp;#include   <string.h>   
&nbsp;&nbsp;#include   <sys/types.h>   
&nbsp;&nbsp;#include   <sys/socket.h>
#include <sys/wait.h>   
&nbsp;&nbsp;#include   <netinet/in.h>   
&nbsp;&nbsp;#include   <mysql/mysql.h>   
&nbsp;&nbsp;#include   <signal.h>   
&nbsp;&nbsp;#include   <errno.h>   
&nbsp;&nbsp;#include   <syslog.h>
&nbsp;&nbsp;#include   <time.h>
&nbsp;&nbsp;
#define MAX 0
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int opt =1;
&nbsp;&nbsp;&nbsp;&nbsp; int sockSrv = socket(AF_INET,SOCK_DGRAM,0);
&nbsp;&nbsp;&nbsp;&nbsp; //setsockopt(sockSrv, SOL_SOCKET, SO_REUSEADDR, (const void*)&opt, sizeof(opt));

&nbsp;&nbsp;&nbsp;&nbsp; sockaddr_in addrSrv;
&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_addr.s_addr=htonl(INADDR_ANY);//本地地址转换成网络长字节

&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_family=AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_port=htons(8888);//本地字节转换成网络字节

&nbsp;&nbsp;&nbsp;&nbsp;bind(sockSrv,(sockaddr*)&addrSrv,sizeof(sockaddr));
&nbsp;&nbsp;&nbsp;&nbsp;char recvBuf[100];
&nbsp;&nbsp;&nbsp;&nbsp;char sendBuf[100];
&nbsp;&nbsp;&nbsp;&nbsp;char tempBuf[100];
&nbsp;&nbsp;&nbsp;&nbsp; sockaddr_in addrClient;
&nbsp;&nbsp;&nbsp;&nbsp; int len = sizeof(sockaddr);
&nbsp;&nbsp;&nbsp;&nbsp;printf("聊天程序服务器!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;struct timeval tv;
&nbsp;&nbsp;&nbsp;&nbsp;tv.tv_sec=1;
&nbsp;&nbsp;&nbsp;&nbsp;tv.tv_usec=0;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd_set fdsocket;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_ZERO(&fdsocket);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(sockSrv,&fdsocket);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(select(MAX+1,&fdsocket,NULL,NULL,&tv))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(FD_ISSET(sockSrv,&fdsocket))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recvfrom(sockSrv,recvBuf,100,0,(sockaddr*)&addrClient,(socklen_t *)&len); //等待接受数据

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

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;close(sockSrv);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
发表于 2008-03-28 17:51 |显示全部楼层
在Windows下,,,,我测试过,,如果程序不初始化 套接字库,,,也会占用很高的cpu,

Linux 的套接字不是不用加载吗???

为啥 cpu 会这么高呢,

咋解决呢?     

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2008-03-28 17:54 |显示全部楼层
都怪你没判断错误码..

select 第一个参数不对..

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
发表于 2008-03-28 17:56 |显示全部楼层
if(select(MAX+1,&fdsocket,NULL,NULL,&tv))
        {
              ...
        }
        else usleep(1000);

论坛徽章:
126
15-16赛季CBA联赛之浙江
日期:2016-12-27 11:43:0315-16赛季CBA联赛之福建
日期:2017-10-10 11:30:3015-16赛季CBA联赛之山东
日期:2017-10-12 19:25:3915-16赛季CBA联赛之四川
日期:2017-12-18 15:16:2715-16赛季CBA联赛之天津
日期:2017-12-27 15:06:1515-16赛季CBA联赛之八一
日期:2018-01-05 13:00:4215-16赛季CBA联赛之福建
日期:2018-01-10 13:36:2115-16赛季CBA联赛之八一
日期:2018-02-01 12:27:0215-16赛季CBA联赛之江苏
日期:2018-02-02 19:44:2515-16赛季CBA联赛之北京
日期:2017-08-29 14:01:4415-16赛季CBA联赛之福建
日期:2017-07-31 21:47:52CU十四周年纪念徽章
日期:2017-07-13 10:10:21
发表于 2008-03-28 17:58 |显示全部楼层
夸张, 一个socket还用select?

while(recvfrom(...))
{
  do ...
}

论坛徽章:
0
发表于 2008-03-28 18:02 |显示全部楼层
回 3楼仁兄:

再多说点嘛......


回 4楼 仁兄:

这个方法.......感觉............


回5楼 仁兄:

  这不是遇到一个问题了么,,
  ,一样的代码在 Windows下,如果不是初始化
套接字库,cpu也占用 很高???

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2008-03-28 18:03 |显示全部楼层
select(sockSvr+1,

论坛徽章:
0
发表于 2008-03-28 18:04 |显示全部楼层
我改了,,,cpu 还是高...........

论坛徽章:
126
15-16赛季CBA联赛之浙江
日期:2016-12-27 11:43:0315-16赛季CBA联赛之福建
日期:2017-10-10 11:30:3015-16赛季CBA联赛之山东
日期:2017-10-12 19:25:3915-16赛季CBA联赛之四川
日期:2017-12-18 15:16:2715-16赛季CBA联赛之天津
日期:2017-12-27 15:06:1515-16赛季CBA联赛之八一
日期:2018-01-05 13:00:4215-16赛季CBA联赛之福建
日期:2018-01-10 13:36:2115-16赛季CBA联赛之八一
日期:2018-02-01 12:27:0215-16赛季CBA联赛之江苏
日期:2018-02-02 19:44:2515-16赛季CBA联赛之北京
日期:2017-08-29 14:01:4415-16赛季CBA联赛之福建
日期:2017-07-31 21:47:52CU十四周年纪念徽章
日期:2017-07-13 10:10:21
发表于 2008-03-28 18:12 |显示全部楼层
windows程序+

    WSADATA wsadata;
    WSAStartup( MAKEWORD( 2, 0 ), &wsadata );

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2008-03-28 18:28 |显示全部楼层
struct timeval tv;
    tv.tv_sec=1;
    tv.tv_usec=0;
放到循环里边

select 的所有参数每次调用时都需要重设
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP