免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 17945 | 回复: 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);

论坛徽章:
119
15-16赛季CBA联赛之八一
日期:2016-12-05 11:36:2615-16赛季CBA联赛之江苏
日期:2017-03-01 18:38:0315-16赛季CBA联赛之福建
日期:2017-04-26 15:15:2415-16赛季CBA联赛之浙江
日期:2017-06-09 16:51:1015-16赛季CBA联赛之上海
日期:2017-06-27 21:27:0715-16赛季CBA联赛之八一
日期:2017-06-28 11:12:20CU十四周年纪念徽章
日期:2017-07-13 10:10:2115-16赛季CBA联赛之福建
日期:2017-07-31 21:47:5215-16赛季CBA联赛之北京
日期:2017-08-29 14:01:4415-16赛季CBA联赛之福建
日期:2017-10-10 11:30:302017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之广东
日期:2017-01-06 15:01:09
发表于 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 还是高...........

论坛徽章:
119
15-16赛季CBA联赛之八一
日期:2016-12-05 11:36:2615-16赛季CBA联赛之江苏
日期:2017-03-01 18:38:0315-16赛季CBA联赛之福建
日期:2017-04-26 15:15:2415-16赛季CBA联赛之浙江
日期:2017-06-09 16:51:1015-16赛季CBA联赛之上海
日期:2017-06-27 21:27:0715-16赛季CBA联赛之八一
日期:2017-06-28 11:12:20CU十四周年纪念徽章
日期:2017-07-13 10:10:2115-16赛季CBA联赛之福建
日期:2017-07-31 21:47:5215-16赛季CBA联赛之北京
日期:2017-08-29 14:01:4415-16赛季CBA联赛之福建
日期:2017-10-10 11:30:302017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之广东
日期:2017-01-06 15:01:09
发表于 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 的所有参数每次调用时都需要重设
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP