使用/dev/poll的str_cli函数
void str_cli(FILE *fp, int sockfd)
{
int stdineof;
char buf[MAXLINE];
int n;
int wfd;
struct pollfd pollfd[];
struct dvpoll dopoll;
int i;
int result; wfd = open("/dev/poll", O_RDWR, ); pollfd[].fd = fileno(fp);
pollfd[].events = POLLIN;
pollfd[].revents = ; pollfd[].fd = sockfd;
pollfd[].events = POLLIN;
pollfd[].revents = ; write(wfd, pollfd, sizeof(struct pollfd) * ); stdineof = ;
for ( ; ; ) {
/* block until /dev/poll says something is ready */
dopoll.dp_timeout = -;
dopoll.dp_nfds = ;
dopoll.dp_fds = pollfd;
result = ioctl(wfd, DP_POLL, &dopoll); /* loop through ready file descriptors */
for (i = ; i < result; i++) {
if (dopoll.dp_fds[i].fd == sockfd) {
/* socket is readable */
if ( (n = read(sockfd, buf, MAXLINE)) == ) {
if (stdineof == )
return; /* normal termination */
else
err_quit("str_cli: server terminated prematurely");
} write(fileno(stdout), buf, n);
} else {
/* input is readable */
if ( (n = read(fileno(fp), buf, MAXLINE)) == ) {
stdineof = ;
shutdown(sockfd, SHUT_WR); /* send FIN */
continue;
} writen(sockfd, buf, n);
}
}
}
}
使用/dev/poll的str_cli函数的更多相关文章
- select使用实例——str_cli函数(修订版)
		
我们可以使用select函数重写http://www.cnblogs.com/nufangrensheng/p/3587962.html中的str_cli函数,这样服务器进程一终止,客户就能马上得到通 ...
 - 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")
		
一.利用select多路复用I/O的Web服务应用模型 /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...
 - TCP回射客户程序:str_cli函数
		
str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务 ...
 - /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4)
		
/dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4) libevent ...
 - 详解网络编程必会的poll和epoll函数
		
前言 之前已经介绍过select函数,请参考这篇博客:https://www.cnblogs.com/liudw-0215/p/9661583.html,原理都是类似的,有时间先阅读下那篇博客,以便于 ...
 - 使用fork的str_cli函数
		
void str_cli(FILE *fp, int sockfd) { pid_t pid; char sendline[MAXLINE], recvline[MAXLINE]; ) { /* ch ...
 - 非阻塞读和写:str_cli函数
		
void str_cli(FILE *fp, int sockfd) { int maxfdp1, val, stdineof; ssize_t n, nwritten; fd_set rset, w ...
 - 使用kqueue的str_cli函数
		
void str_cli(FILE *fp, int sockfd) { , isfile; char buf[MAXLINE]; ]; struct timespec ts; struct stat ...
 - 使用select正确处理EOF的str_cli函数
		
void str_cli(FILE *fp, int sockfd) { int maxfdp1, stdineof; fd_set rset; char buf[MAXLINE]; int n; s ...
 
随机推荐
- Tree 树形结构
			
一.树的基本概念 (1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构. 树可以是一棵空树,它没有任何的结点:也可以是一棵非空树,至少含有一个结点. (2)根(Root) ...
 - slice()和splice()区别
			
1.slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素. 注意:该方法不会改变原数组,而是返回一个子数组,如果想删除 ...
 - MySQL之库相关操作
			
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
 - 获取与esp8266连接的客户端的Mac地址 IP 端口 控制停止等问题
			
两个关键的库 ESP8266WebServer.h WiFiClient.h ESP8266WiFiAP.cpp C:\Users\dongdong\Desktop\Arduino-master\li ...
 - ES6相关
			
1.变量声明 let 和const 传统的 var 关键字声明变量,会存在变量提升.在ES6中,我们用 let 和 const 声明,let 声明变量,const 声明常量,let 和 const 都 ...
 - Flask    ——   信号(5)
			
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
 - Java canlendar task
			
DayPilot for Java - Calendar, Scheduler and Gantt Chart Componentshttps://java.daypilot.org/ AJAX Sc ...
 - redis cli命令
			
redis安装后,在src和/usr/local/bin下有几个以redis开头的可执行文件,称为redis shell,这些可执行文件可做很多事情. 可执行文件 作用 redis-server 启 ...
 - 使用ffmpeg视频切片并加密
			
想达到的目的:将一个mp4视频文件切割为多个ts片段,并在切割过程中对每一个片段使用 AES-128 加密,最后生成一个m3u8的视频索引文件: 电脑环境 Fedora,已经安装了最新的ffmpeg: ...
 - luogu5316
			
P5316 恋恋的数学题 题目背景 恋恋是个可爱的女孩子,最近她沉迷了做数学题. 题目描述 现在恋恋正在处理的题目十分简单:现在有k \space (2\leq k\leq 4)k (2≤k≤4)个数 ...