免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2008-03-28 17:51 |只看该作者
在Windows下,,,,我测试过,,如果程序不初始化 套接字库,,,也会占用很高的cpu,

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

为啥 cpu 会这么高呢,

咋解决呢?     

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-03-28 17:54 |只看该作者
都怪你没判断错误码..

select 第一个参数不对..

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
4 [报告]
发表于 2008-03-28 17:56 |只看该作者
if(select(MAX+1,&fdsocket,NULL,NULL,&tv))
        {
              ...
        }
        else usleep(1000);

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
5 [报告]
发表于 2008-03-28 17:58 |只看该作者
夸张, 一个socket还用select?

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

论坛徽章:
0
6 [报告]
发表于 2008-03-28 18:02 |只看该作者
回 3楼仁兄:

再多说点嘛......


回 4楼 仁兄:

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


回5楼 仁兄:

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-03-28 18:03 |只看该作者
select(sockSvr+1,

论坛徽章:
0
8 [报告]
发表于 2008-03-28 18:04 |只看该作者
我改了,,,cpu 还是高...........

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
9 [报告]
发表于 2008-03-28 18:12 |只看该作者
windows程序+

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-03-28 18:28 |只看该作者
struct timeval tv;
    tv.tv_sec=1;
    tv.tv_usec=0;
放到循环里边

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP