epoll编程实例客户端_0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序...

本文介绍了使用select、poll和epoll三种模型在Linux下编写客户端程序的方法。详细阐述了每种模型的工作原理,并提供了对应的C语言代码示例。select模型涉及初始化描述符集合和轮询等待;poll模型利用pollfd结构体进行监听;epoll模型则利用epoll_create、epoll_ctl和epoll_wait进行高效事件驱动。epoll在处理大量并发连接时表现出更高的性能和效率。
摘要由CSDN通过智能技术生成

1.select 模型

1.1 select 函数原型如下,其中 nfds 表示的描述符的最大值加1(因为这里是左闭右开区间),中间三个参数分别表示要监听的不同类型描述符的集合,timeout用来表示轮询的时间间隔,这里用NULL表示无限等待。

1.2使用 select函数编写客户端程序的一般步骤:

a)初始化参数,包括初始化监听集合read_set并添加fd,以及初始化监听的最大描述符 maxfd 和select的返回值 nready;

b)将read_set 赋值给 ready_set,因为每次执行select函数监听结合都会改变,read_set用来保存原始的集合;

c)执行 select调用,检查返回值;

d)依次检查fd,分别执行不同的操作;

1.3 程序示例。

#include "def.h"

#include

/*

* 使用select模型 编写客户端程序

*

*/

void do_service(int peerfd);

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

{

//1.创建 socket

int peerfd = socket(AF_INET, SOCK_STREAM, 0);

if(peerfd == -1)

ERR_EXIT("socket");

//2. conncet

struct sockaddr_in peeraddr;

peeraddr.sin_family = AF_INET;

peeraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

peeraddr.sin_port = htons(9999);

if(connect(peerfd, (struct sockaddr*)&peeraddr, sizeof(peeraddr)) == -1)

ERR_EXIT("connect");

do_service(peerfd);

close(peerfd);

return 0;

}

void do_service(int peerfd){

char sendbuf[1024] = {0};

char recvbuf[1024] = {0};

//1.初始化数组,添加要监听的描述符

fd_set read_set, ready_set;

FD_ZERO(&read_set);

FD_SET(STDIN_FILENO, &read_set);

FD_SET(peerfd, &read_set);

int maxfd = STDIN_FILENO > peerfd ? STDIN_FILENO : peerfd;

int nready; //接收select的返回值

// 2.执行监听

while(1){

ready_set = read_set;

nready = select(maxfd + 1, &ready_set, NULL, NULL, NULL);

if(nready == -1){

if(errno == EINTR)

continue;

ERR_EXIT("select");

}

else if(nready == 0)

continue;

// 3.依次检查每个fd是否在集合中

if(FD_ISSET(STDIN_FILENO, &ready_set)){

if(fgets(sendbuf, sizeof(sendbuf), stdin) == NULL){

shutdown(peerfd, SHUT_WR);

//从监听集合中移除该fd

FD_CLR(STDIN_FILENO, &read_set);

}

writen(peerfd, sendbuf, strlen(sendbuf));

}

if(FD_ISSET(peerfd, &ready_set)){

int ret = readline(peerfd, recvbuf, sizeof(recvbuf));

if(ret == -1)

ERR_EXIT("readline");

else if(ret == 0){

close(peerfd);

printf("server closed\n");

break;

}

printf("recv data: %s", recvbuf);

}

}

}

2.poll模型

2.1 poll 函数

2.1.1 poll函数原型如下,第一个参数为要监听的描述符数组,第二个是数组的长度,第三个表示轮询的间隔(负值表示无限等待)。

2.1.2 poll的第一个参数结构体如下,fd即为要监听的描述符,events表示等待的事件,我们一般使用POLLIN,revents是一个传出参数,我们用它来判断等待的事件是否发生。

2.2 使用 poll 编写客户端程序的一般步骤:

a)准备数组(即poll函数的第一个参数),填入相应的 fd 和 events,定义maxi(数组下标的最大值)和nready(接收poll的返回值)变量;

b)进入w

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值