IO 复用
来源:互联网 发布:linux killproc 编辑:程序博客网 时间:2024/05/16 14:07
I/O复用典型的场景
1)客户处理多个描述符时
2)如果TCP服务器既要处理监听套接字,又要处理已连接套接字。
3)一个服务器既要处理UDP又要处理TCP时
4)一个服务器要处理多个服务或者协议时
I/O模型
1)阻塞式
2)非阻塞式
3)IO复用 select poll等
4)信号驱动I/O
5)异步I/O
相比较每个客户端起进程select 模型显然更大些,省资源,方便管理。
服务端
#include <stdio.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <sys/select.h>#define max(x,y) ((x) > (y) ? (x) : (y))void str_cli(FILE *fp, int sockfd){ fd_set rset; int maxfdp1, stdineof; char buf[1024]; int n; stdineof = 0; FD_ZERO(&rset); for( ; ; ) { if(stdineof == 0) { FD_SET(fileno(fp), &rset); } FD_SET(sockfd, &rset); maxfdp1 = max(fileno(fp), sockfd) + 1; select(maxfdp1, &rset, NULL, NULL, NULL); if(FD_ISSET(sockfd,&rset)) { if( (n == read(sockfd, buf, 1024)) ==0) { if(stdineof == 1) return; else printf("str_cli: server terminated prematurely \n"); } write(fileno(stdout), buf, n); } if(FD_ISSET(fileno(fp),&rset)) { if( (n == read(fileno(fp), buf, 1024)) ==0) { stdineof =1; shutdown(sockfd, SHUT_WR); FD_CLR(fileno(fp), &rset); continue; } write(sockfd, buf, n); } }}int main(int argc , char** argv){ int sockfd; struct sockaddr_in seraddr; if(argc !=2) { printf("argc error\r\n"); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error\r\n"); } bzero(&seraddr, sizeof(seraddr)); seraddr.sin_family = AF_INET; seraddr.sin_port = htons(13000); if((inet_pton(AF_INET, argv[1], &seraddr.sin_addr)) < 0) { printf("inet_pton error\r\n"); } if(connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr)) < 0) { printf("connect error\r\n"); } str_cli(stdin, sockfd); return 0;}
客户端
#include <stdio.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <sys/select.h>#define max(x,y) ((x)>(y)?(x):(y))void str_cli(FILE *fp, int sockfd){ fd_set rset; int maxfdp1, stdineof; char buf[1024]; int n; stdineof = 0; FD_ZERO(&rset); for( ; ; ) { if(stdineof == 0) { FD_SET(fileno(fp), &rset); } FD_SET(sockfd, &rset); maxfdp1 = max(fileno(fp), sockfd) + 1; select(maxfdp1, &rset, NULL, NULL, NULL); if(FD_ISSET(sockfd,&rset)) { if( (n == read(sockfd, buf, 1024)) ==0) { if(stdineof == 1) return; else printf("str_cli: server terminated prematurely \n"); } write(fileno(stdout), buf, n); } if(FD_ISSET(fileno(fp),&rset)) { if( (n = read(fileno(fp), buf, 1024)) ==0) { stdineof =1; shutdown(sockfd, SHUT_WR); FD_CLR(fileno(fp), &rset); continue; } printf("write\r\n"); write(sockfd, buf, n); } }}int main(int argc , char** argv){ int sockfd; struct sockaddr_in seraddr; if(argc !=2) { printf("argc error\r\n"); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error\r\n"); } bzero(&seraddr, sizeof(seraddr)); seraddr.sin_family = AF_INET; seraddr.sin_port = htons(13000); if((inet_pton(AF_INET, argv[1], &seraddr.sin_addr)) < 0) { printf("inet_pton error\r\n"); } if(connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr)) < 0) { printf("connect error\r\n"); } str_cli(stdin, sockfd); return 0;}
遇到的问题
判断语句写错
if( (n == read(fileno(fp), buf, 1024)) ==0)
if(FD_SET(fileno(fp),&rset))
0 0
- IO复用
- IO 复用
- IO复用
- IO复用
- IO 复用
- IO复用
- IO复用
- IO复用
- IO复用
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO .
- 网络模型:阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO
- linux下五种IO模型小结(阻塞IO、非阻塞IO、IO复用、信号驱动式IO、异步IO)
- 【UNIX】IO复用
- IO复用,linux poll
- IO复用,linux poll
- Linux的IO复用
- Linux IO 复用
- 支持向量机SVM(一)
- Android :Android Studio中如何找到自己的API
- 百度编辑器上传大容量视频报HTTP错误
- [[UIBarButtonItem alloc] initWithTitle与[[UIBarButtonItem alloc] initWithBarButtonSystemItem的区别
- Android Api Demos登顶之路(九十五)Media-->AudioFx
- IO 复用
- 编码解码模型实现中的其他一些考虑
- C++基础---typedef struct与struct的区别
- 布局自动化处理方法
- 温故知新: JavaScript
- View相关知识学习(一)
- 设计模式--工厂方法模式
- RecyclerView的通用适配器,和滚动时不加载图片的封装
- 大多数人并不知道的秘密:接地气,寿命长!