select使用实例——str_cli函数(修订版)
2014-03-09 12:29
337 查看
我们可以使用select函数重写/article/6791685.html中的str_cli函数,这样服务器进程一终止,客户就能马上得到通知。早先那个版本的问题在于:当套接口上发生某些事件时,客户可能阻塞于fgets调用。新版本改为阻塞于select调用,等待要么标准输入可读,要么套接口可读。下图展示了调用select所处理的各种条件。
客户的套接口上的三个条件处理如下:
(i)如果对端TCP发送数据,那么该套接口变为可读,并且read返回一个大于0的值(即读入数据的字节数)。
(ii)如果对端TCP发送一个FIN(对端进程终止),那么该头接口变为可读,并且read返回0(EOF)。
(iii)如果对端TCP发送一个RST(对端主机崩溃并重新启动),那么该套接口变为可读,并且read返回-1,而errno中含有确切的错误代码。
新版本源代码:
调用select
我们只需要一个用于检查可读性的描述字集。该集合由FD_ZERO初始化,并用FD_SET打开两位:一位对应于标准I/O文件指针fp,一位对应于套接口sockfd。fileno函数把标准I/O文件指针转换为对应的描述字。select和poll只工作在描述字上。
计算出两个描述字中的较大值后,调用select。在该调用中,写集合指针和异常集合指针都是空指针。最后一个参数(时间限制)也是空指针,因为我们希望本调用阻塞到某个描述字就绪为止。
客户的套接口上的三个条件处理如下:
(i)如果对端TCP发送数据,那么该套接口变为可读,并且read返回一个大于0的值(即读入数据的字节数)。
(ii)如果对端TCP发送一个FIN(对端进程终止),那么该头接口变为可读,并且read返回0(EOF)。
(iii)如果对端TCP发送一个RST(对端主机崩溃并重新启动),那么该套接口变为可读,并且read返回-1,而errno中含有确切的错误代码。
新版本源代码:
#include <stdio.h> #include <sys/select.h> #include <sys/time.h> #include <errno.h> #include <stdlib.h> #include <string.h> int max(int a, int b) { return(a >= b ? a : b); } void str_cli(FILE *fp, int sockfd) { int maxfdpl; fd_set rset; char sendline[4096], recvline[4096]; FD_ZERO(&rset); for(;;) { FD_SET(fileno(fp), &rset); FD_SET(sockfd, &rset); maxfdpl = max(fileno(fp), sockfd) + 1; if(select(maxfdpl, &rset, NULL, NULL, NULL) < 0) { perror("select"); exit(1); } if(FD_ISSET(sockfd, &rset)) /* socket is readable */ { if(readline(sockfd, recvline, 4096) == 0) { printf("str_cli: server terminated prematurely\n"); exit(1); } fputs(recvline, stdout); } if(FD_ISSET(fileno(fp), &rset)) /* input is readable */ { if(fgets(sendline, 4096, fp) == NULL) return; writen(sockfd, sendline, strlen(sendline)); } } }
调用select
我们只需要一个用于检查可读性的描述字集。该集合由FD_ZERO初始化,并用FD_SET打开两位:一位对应于标准I/O文件指针fp,一位对应于套接口sockfd。fileno函数把标准I/O文件指针转换为对应的描述字。select和poll只工作在描述字上。
计算出两个描述字中的较大值后,调用select。在该调用中,写集合指针和异常集合指针都是空指针。最后一个参数(时间限制)也是空指针,因为我们希望本调用阻塞到某个描述字就绪为止。
相关文章推荐
- UNIX网络编程学习(14)--使用select正确处理EOF的str_cli函数修订版
- UNIX网络编程学习(13)--使用select的str_cli函数的实现
- client 和 server 通讯实例(使用 select 函数)
- SQL SERVER STR等函数及语法 与使用实例 与Postgre数据库的函数使用区别
- 利用select和shutdown的str_cli函数
- php pack、unpack、ord 函数使用方法(二进制流接口应用实例)
- php数组查找函数in_array()、array_search()、array_key_exists()使用实例
- c++CreateEvent函数在多线程中使用及实例
- C语言判断文件夹或者文件是否存在以及权限等信息access函数和删除文件或目录 remove()函数使用实例
- MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- c 函数不定参数(不限参数)使用实例 不定参数输出函数
- 每天一个JavaScript实例-使用带有定时器的函数闭包
- [Linux文件]使用read函数从文件读取数据的实例
- signal函数使用小实例
- Php中使用Select 查询语句的实例
- Python List相关函数使用实例
- Php中使用Select 查询语句的实例
- 【例2.1】使用成员函数的实例
- vector使用排序函数实例
- sscanf()函数的使用及其实例