linux下epoll实例,linux c IO复用之epoll模型实例 实现服务器与多个客户端进行通信...

#include#define backlogs 10

#define BUF_SIZE 150

int Socket(int domain,int type,int protocol)

{

int fd=socket(domain,type,protocol);

if(fd==-1)

return -1;

return fd;

}

int Bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

{

int ret=bind(sockfd,addr,addrlen);

if(ret==-1)

return -1;

return ret;

}

int Listen(int sockfd,int backlog)

{

int ret=listen(sockfd,backlog);

if(ret==-1)

return -1;

return ret;

}

int start_up(const char* ip,int port)

{

int fd=Socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in ser_addr;

ser_addr.sin_family=AF_INET;

ser_addr.sin_port=htons(port);

ser_addr.sin_addr.s_addr=inet_addr(ip);

int on=1;

setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(int));

socklen_t addrlen=sizeof(struct sockaddr);

Bind(fd,(struct sockaddr*)&ser_addr,addrlen);

Listen(fd,backlogs);

return fd;

}

///

//ser.c

#include"util.h"

#define OPEN_MAX 5000

int main(int argc,char *argv[])

{

int i,listenfd,connfd,sockfd;

int n,num=0;

ssize_t nready,efd,res;

char buf[BUF_SIZE],str[INET_ADDRSTRLEN];//16

socklen_t clilen;

struct sockaddr_in cliaddr,servaddr;

struct epoll_event tep,ep[OPEN_MAX];//tep:epoll_ctl参数 ep: epoll_wait()参数

listenfd=start_up(argv[1],atoi(argv[2]));

efd=epoll_create(OPEN_MAX); //创建epoll模型,efd指向红黑树根节点

if(efd==-1)

{

perror("epoll_create error!\n");

exit(1);

}

tep.events=EPOLLIN; tep.data.fd=listenfd; //指定listenfd的监听事件为"读"

res=epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep);//将listenfd及对应的结构体设置到树上,

//efd可找到该树

if(res==-1)

{

perror("epoll_ctl error!\n");

exit(1);

}

while(1)

{

//epoll为server阻塞监听事件,ep为struct epoll_event类型数组,OPEN_MAX为数组容量,-1表示永

//久阻塞

nready=epoll_wait(efd,ep,OPEN_MAX,-1);

if(nready==-1)

{

perror("epoll_wait error!!!\n");

exit(1);

}

for(i=0;i");

scanf("%s",sendbuf);

send(cli_fd,sendbuf,strlen(sendbuf)+1,0);

recv(cli_fd,recvbuf,128,0);

printf("From Self Cli:%s\n",recvbuf);

}

close(cli_fd);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的第一个问题是关于epoll编程实例客户端的,我会尽力回答。以下是关于epoll()的3步搞定的译文: epoll() 3步搞定 在Linux下,网络编程中经常使用epoll()函数来实现IO多路复用。下面将介绍使用epoll()函数的3个步骤。 步骤1:创建epoll句柄 使用epoll_create()函数创建一个epoll句柄。 int epoll_create(int size); size参数用于指定epoll句柄的大小,一般设置为大于0的整数即可。 示例代码如下: int epfd = epoll_create(1024); 步骤2:注册文件描述符到epoll句柄中 使用epoll_ctl()函数将需要监控的文件描述符注册到epoll句柄中。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 其中,epfd是epoll句柄,op是操作类型,fd是需要监控的文件描述符,event是一个epoll_event结构体,用于指定事件类型和其他相关参数。 示例代码如下: struct epoll_event ev; ev.events = EPOLLIN | EPOLLET; ev.data.fd = sockfd; epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); 步骤3:等待事件的发生 使用epoll_wait()函数等待事件的发生。 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 其中,epfd是epoll句柄,events是一个epoll_event结构体数组,用于存储发生的事件,maxevents是events数组的大小,timeout是等待时间,单位为毫秒,设置为-1表示一直等待,设置为0表示立即返回。 示例代码如下: struct epoll_event events[10]; int n = epoll_wait(epfd, events, 10, -1); for (int i = 0; i < n; i++) { if (events[i].events & EPOLLIN) { // 处理可读事件 } } 以上就是使用epoll()函数的3个步骤,通过这些步骤可以实现高效的IO多路复用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值