Linux中poll与epoll的实例

函数原型如下

 

 poll

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#define NUM 100
int main(int argc,char* argv[]){
	if(argc != 3) printf("请输入ip地址和端口号!\n"),exit(0);
	printf("ip:%s    port:%d\n",argv[1],atoi(argv[2]));
	//1 创建socket
	int server = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == server) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");
	//2 创建服务器协议地址簇
	struct sockaddr_in addr = {0};
	addr.sin_family = AF_INET;//协议类型   和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr(argv[1]);//把字符串 转成 整型
	addr.sin_port = htons(atoi(argv[2]));//整型 转成 整型  小端转大端
	//3 绑定
	int r = bind(server,(struct sockaddr*)&addr,sizeof addr);
	if(-1 == r) printf("绑定失败:%m\n"),close(serverSocket),exit(-2);
	printf("绑定成功!\n");
	//4 监听
	r = listen(server,10);
	if(-1 == r) printf("监听失败:%m\n"),close(serverSocket),exit(-2);
	printf("监听成功!\n");
    struct pollfd fds[NUM];
    fds[0].fd=server;
    fds[0].events=POLLIN;
    int cfd;
    for(int i=1;i<NUM;i++)
    {
        fds[i].fd=-1;
        fds[i].events=POLLIN;
    }
    while(1)
    {
        int r=poll(&fds,NUM,0);
        if(r==-1)
        {
            printf("服务器崩溃\n");
        }
        else if(r==0)
        {
             printf("服务器加载中\n");
             continue;
        }
        else
        {
            if(fds[0].revents&POLLIN)
            {
                cfd=accept(server,NULL,NULL);
                if(cfd<0)
                {
                    printf("客户端链接失败\n");
                }
                else
                {
                    printf("服务器链接成功\n");
                    for(int i=1;i<NUM;i++)
                    {
                        if(fds[i].fd==-1)
                        {
                            fds[i]=cfd;
                            fds[i].events=POLLIN;
                            break;
                        }
                    }
                }
            }
        }
        char buff[1024];
        for(int i=1;i<NUM;i++)
        {
            if((fds[i].revents&POLLIN)&&fds[i].fd!=-1)
            {
                int r=recv(fds[i].fd,buff,1023,0);
                if(r>0)
                {
                    buff[r]=0;
                    printf(">>%d:%s",fds[i].fd,buff);
                }
                else
                {
                    fds[i].fd=-1;
                }
            }
        }
        
    }
    
return 0;
}

epoll

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#define NUM 100
int main(int argc,char* argv[]){
	if(argc != 3) printf("请输入ip地址和端口号!\n"),exit(0);
	printf("ip:%s    port:%d\n",argv[1],atoi(argv[2]));
	//1 创建socket
	int server = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == server) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");
	//2 创建服务器协议地址簇
	struct sockaddr_in addr = {0};
	addr.sin_family = AF_INET;//协议类型   和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr(argv[1]);//把字符串 转成 整型
	addr.sin_port = htons(atoi(argv[2]));//整型 转成 整型  小端转大端
	//3 绑定
	int r = bind(server,(struct sockaddr*)&addr,sizeof addr);
	if(-1 == r) printf("绑定失败:%m\n"),close(serverSocket),exit(-2);
	printf("绑定成功!\n");
	//4 监听
	r = listen(server,10);
	if(-1 == r) printf("监听失败:%m\n"),close(serverSocket),exit(-2);
	printf("监听成功!\n");
    int ePoll=epoll_create(5);里面数据可以不管,但必须大于0
    struct epoll_event ev;//注册用
    struct epoll_event events[NUM];//操作用
    ev.events=POLLIN;
    ev.data.fd=server;
    epoll_ctl(ePoll,EPOLL_CTL_ADD,server,&ev);
    while(1)
    {
        int ret=epoll_wait(ePoll,events,NUM,0);
        if(ret==-1)
        {
            printf("服务器奔溃\n");
        }
        else if(ret==0)
        {
            printf("服务器加载中\n");
        }
        else 
        {
            for(int i=0;i<ret;i++)
            {
                if(events[i].data.fd==server)
                {
                    int cfd=accept(server,NULL,NULL);
                    if(cfd<0)
                    {
                        printf("客户端链接失败\n");
                    }
                    else
                    {
                        printf("客户端链接成功\n");
                        ev.events=POLLIN;
                        ev.data.fd=cfd;
                        epoll_ctl(ePoll,EPOLL_CTL_ADD,cfd,&ev);
                    }
                }
                else if(events[i].events&POLLIN)
                {        char buff[1024];
                        int r=recv(events[i].data.fd,buff,1023,0);
                        if(r>0)
                        {    
                            buff[r]=0;
                            printf(">>%d:%s",events[i].data.fd,buff);
                        }
                }
                
            }
        }
        
    }
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值