unix--网络编程IO复用
来源:互联网 发布:公安大数据分析研判 编辑:程序博客网 时间:2024/06/06 07:26
I/o复用问题:
#include#include #include #include #include #include #include #include #include #include #include #include #include #define PORT 34561#define MAX 100const char * end="quit\n";void err_quit(const char *s){ puts(s); exit(0);}int Max(const int a,const int b){ return a>b?a:b;}void str_cli(const int con,FILE *fp){ char sen[MAX],rec[MAX]; int num,maxfd,nread,flag=0; fd_set rset; __DARWIN_FD_ZERO(&rset); memset(sen, 0, MAX); memset(rec, 0, MAX); while(1) { /* 在这里要考虑一个问题,当服务器发送一个EOF信号过来我们的处理是关闭 还有就是客户端发送信号时候我们也应该要考虑到的是关闭写操作 */ __DARWIN_FD_SET(con, &rset); __DARWIN_FD_SET(fileno(fp), &rset); maxfd=Max(fileno(fp), con)+1; nread=select(maxfd, &rset, NULL, NULL, NULL); if(nread==0) { if(errno!=EINPROGRESS) return -1; } if(__DARWIN_FD_ISSET(con, &rset)) { num=(int)recv(con, rec, MAX, 0); rec[num]='\0'; fprintf(stdout, "recviev from server %s\n",rec); if(num<=0||num>MAX){ if(flag==1) return; else err_quit("server is termianted"); } } if(__DARWIN_FD_ISSET(fileno(fp), &rset)) { if(fgets(sen,MAX,fp)==NULL) { flag=1; shutdown(fileno(fp), SHUT_WR); __DARWIN_FD_CLR(fileno(fp), &rset); continue; } printf("\n"); send(con, sen, MAX, 0); if(strcmp(end, sen)==0) err_quit("client is over!"); } }}void setInitialServer(struct sockaddr_in * server){ bzero(server, sizeof(*server)); server->sin_family=AF_INET; server->sin_port=htons(PORT); server->sin_addr.s_addr=inet_addr("127.0.0.1");}int Connection(const int A,const struct sockaddr *server ,socklen_t size){ int con; con=connect(A, server, size); if(con==-1) err_quit("connection is error"); return con;}int main(int argc, const char * argv[]) { // insert code here... struct sockaddr_in server,client; int sockfd; socklen_t len=sizeof(client); sockfd=socket(AF_INET, SOCK_STREAM, 0); if(sockfd==-1) err_quit("socket error!"); setInitialServer(&server); Connection(sockfd, (struct sockaddr *)&server, len); str_cli(sockfd, stdin); close(sockfd); return 0;}
select Server:
struct sockaddr_in server,clinet; Client cli[__DARWIN_FD_SETSIZE]; fd_set rset,allset; char rea[MAX]; int socked,num,conn,maxi,maxfd,i,nread,scok; socklen_t len=sizeof(clinet); bzero(&server, sizeof(server)); memset(rea,0,MAX); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); socked=socket(AF_INET, SOCK_STREAM, 0); if(socked==-1) { err_quit("socket error!"); } if(bind(socked, (struct sockaddr*)&server, sizeof(server))==-1) { err_quit("bind error!"); } if(listen(socked,LAN)==-1) err_quit("listen error"); __DARWIN_FD_ZERO(&rset); __DARWIN_FD_ZERO(&allset); __DARWIN_FD_SET(socked, &allset); maxi=-1; maxfd=socked; for(i=0;i<__DARWIN_FD_SETSIZE;i++) { cli[i].fd=-1; } while(1) { rset=allset; nread=select(maxfd+1, &rset, NULL, NULL, NULL); if(nread==0) { if(errno!=EINPROGRESS) return -1; } if(__DARWIN_FD_ISSET(socked, &rset)){ conn=accept(socked, (struct sockaddr *)&clinet, &len); if(conn<0) { if(errno==EINTR) continue; else { puts("error"); exit(0); } } for(i=0;i<__DARWIN_FD_SETSIZE;i++) if(cli[i].fd<0) { cli[i].fd=conn; cli[i].client=clinet; printf("the client's ip is %s,the id is %d\n",inet_ntoa(clinet.sin_addr),ntohs(clinet.sin_port)); memset(cli[i].data, 0, MAX); break; } __DARWIN_FD_SET(conn, &allset); if(i>maxi) maxi=i; if(conn>maxfd) maxfd=conn; if(i==__DARWIN_FD_SETSIZE) err_quit("too many clients!"); if(--nread<=0) continue; } for(i=0;i<=maxi;i++) { if((scok=cli[i].fd)<0) continue; if(__DARWIN_FD_ISSET(scok, &rset)) { printf("test\n"); if((num=(int)read(scok,rea,MAX))==0) { close(scok); printf("the client information %s\n",cli[i].data); __DARWIN_FD_CLR(scok, &allset); cli[i].fd=-1; } else pro_str(cli[i], rea, MAX); if(--nread<=0) break; } } }
poll server:
/* struct pollfd{ int fd; 描述字符 short events; 调用值 short revents; 返回值 }; */ struct pollfd polls[OPEN_MAX]; polls[0].events=POLLRDBAND; polls[0].fd=sockfd; for(i=1;imaxi) maxi=i; if(--nready<=0) continue; } for(i=1;i 0&&num
阅读全文
0 0
- unix--网络编程IO复用
- Unix网络编程之IO复用
- unix网络编程笔记(四)--IO复用
- unix网络编程(五)--IO复用+非阻塞
- UNIX网络编程笔记 第六章 IO复用
- unix网络编程------5种IO模型
- 【UNIX】网络编程/多路复用IO服务器编码
- Unix网络编程5种IO模型
- UNIX网络编程之IO复用(一):select系统调用
- Linux/Unix IO多路复用之poll网络编程(含源码)
- Linux/Unix IO多路复用之select网络编程(含源码)
- Linux/Unix IO多路复用之select网络编程(含源码)
- Linux/Unix IO多路复用之poll网络编程(含源码)
- Unix网络编程 高级IO套接字设置超时
- 【UNIX网络编程】非阻塞式IO总结
- UNIX网络编程笔记(10)—高级IO函数
- UNIX网络编程笔记(12)—非阻塞IO
- Unix网络编程--文件IO(1) 基本API
- 二级部门的人员树状结构封装
- NOIP2016普及组T1买铅笔解题报告
- mysql&pymysql
- 关于启动Tomcat时的异常
- CentOS上安装KVM
- unix--网络编程IO复用
- 古典密码——vigenre多表代换密码
- 数据库实例:用户登录
- C++内存模型
- 为Mac添加Sublime Text的命令行
- vector构造二维数组
- bzoj3357 [Usaco2004]等差数列
- 结合redis设计与实现的redis源码学习-4-dict(字典)
- 多线程:控制线程