《UNIX网络编程 卷1》 笔记: 使用poll函数的单进程TCP回射服务器程序
来源:互联网 发布:淘宝申请退换货流程 编辑:程序博客网 时间:2024/06/06 09:51
本节我们使用poll函数来实现单进程TCP回射服务器。poll函数与select函数不同,它不使用描述符集,而是使用pollfd结构体数组,pollfd结构体如下:
struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */};events表示该描述符感兴趣的事件,revents表示在该描述符上发生的事件,各种事件定义如下:
我们定义一个1024大小的pollfd结构体数组,传递给poll函数,poll函数会监听数组里所有有效的描述符。每次一个新的客户连接时,我们为其分配数组中的一项,fd设置为客户套接字描述符,events设置为POLLRDNORM,然后循环处理所有的事件。代码如下:
#include "unp.h"#define OPEN_MAX 1024int main(int argc, char **argv){int i, maxi, listenfd, connfd, sockfd;int nready;ssize_t n;char buf[MAXLINE];socklen_t clilen;struct pollfd client[OPEN_MAX];struct sockaddr_in cliaddr, servaddr;listenfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));Listen(listenfd, LISTENQ);client[0].fd = listenfd; /*监听服务器socket*/client[0].events = POLLRDNORM;for (i = 1; i < OPEN_MAX; i++) /*任何fd为负值的项都被poll忽略*/client[i].fd = -1;maxi = 0;for ( ; ; ) {nready = Poll(client, maxi + 1, -1);if (client[0].revents & POLLRDNORM) { /*新的客户连接*/clilen = sizeof(cliaddr);connfd = Accept(listenfd, (SA *)&cliaddr, &clilen);for (i = 1; i < OPEN_MAX; i++) {if (client[i].fd < 0) {client[i].fd = connfd;break;}}if (i == OPEN_MAX)err_quit("too many clients");client[i].events = POLLRDNORM;if (i > maxi)maxi = i;if (--nready <= 0)continue;}for (i = 1; i <= maxi; i++) {if ((sockfd = client[i].fd) < 0)continue;if (client[i].revents & (POLLRDNORM | POLLERR)) {if ((n = read(sockfd, buf, MAXLINE)) < 0) {if (errno == ECONNRESET) { /*客户复位连接*/Close(sockfd);client[i].fd = -1;} elseerr_sys("read error");} else if (n == 0) { /*客户关闭连接*/Close(sockfd);client[i].fd = -1;} elseWriten(sockfd, buf, n);if (--nready <= 0)break;}}}}
阅读全文
0 0
- 《UNIX网络编程 卷1》 笔记: 使用poll函数的单进程TCP回射服务器程序
- 《UNIX网络编程 卷1》 笔记: 使用select函数的单进程TCP回射服务器程序
- UNIX网络编程学习(15)--使用单进程和select的TCP服务器程序
- UNIX网络编程卷1 回射服务器程序 TCP服务器程序设计范式 四个版本
- 《unix网络编程》(15)poll函数以及使用poll的客户服务器程序
- UNIX网络编程学习(16)--使用poll的TCP服务器程序
- UNIX网络编程——使用select函数的TCP和UDP回射服务器程序
- 《UNIX网络编程 卷1》 笔记: TCP 客户/服务器程序示例
- select和poll函数《UNIX网络编程卷一》笔记
- 学习 UNIX网络编程卷1:套接字 笔记1-实现一个简单的回射客户服务器程序
- 网络编程学习笔记(使用select函数的TCP和UDP回射服务器程序)
- UNIX网络编程卷一 笔记 第五章 TCP客户/服务器程序示例
- UNIX网络编程——使用线程的TCP回射服务器程序
- UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式
- UNIX网络编程卷1 时间获取程序服务器 TCP 协议相关性
- UNIX网络编程卷1:套接字联网-第5章:TCP客户/服务器程序示例
- UNIX网络编程卷1 时间获取程序客户端 TCP 使用非阻塞connect
- 《UNIX网络编程 卷1》 笔记: 服务器程序设计范式
- bugku ctf平台之sql注入1 write up
- DOM
- 第七讲 Spring MVC中AJAX和JSON的处理
- Android 项目从零到上线的全过程
- Linux vmstat命令实战详解
- 《UNIX网络编程 卷1》 笔记: 使用poll函数的单进程TCP回射服务器程序
- id生成策略-(xml、annotation)-4
- 知识图谱的笔记之一(1)
- 一步步学习kotlin for android(一)配置kotlin
- Java基础
- ADAS(2) 各功能模块介绍
- java编程思想阅读笔记之造型检查
- android使用java的反射机制跳转Activity
- C#值类型与引用类型、 out 、 ref、 params 参数、函数重载、数组为函数参数或返回值