Linux网络编程select模型的达成
发布时间:2021-12-13 10:45:48 所属栏目:教程 来源:互联网
导读:简单的使用linux下的select模型实现了一个http的server #include stdio.h #include sys/types.h #include sys/socket.h #include sys/select.h #include errno.h #include netinet/in.h #include unistd.h #include arpa/inet.h #include stdlib.h #define L
|
简单的使用linux下的select模型实现了一个http的server #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/select.h> #include <errno.h> #include <netinet/in.h> #include <unistd.h> #include <arpa/inet.h> #include <stdlib.h> #define LISTENQ 5 #define OPEN_MAX 1024 #define SERV_PORT 10088 #define MAX_LINE 1024 #define INFTIM -1 #define MAXEVENTS 1000 char szHtmlBuf[] = "HTTP/1.1 200 OKrn" "Date: Sat, 05 Jan 2013 03:13:29 GMTrn" "Vary: Accept-Encodingrn" "Content-Type: text/html; charset=gb2312rn" "Accept-Ranges: bytesrn" "Content-Length: 57rn" "rn" "<html> <head>欢迎光临</head> <body>屌丝逆袭季</body></html>"; fd_set fds; void echo_srv(int clientFd) { //处理用户请求数据 char line[MAX_LINE]; printf( "开始读取数据"); int n = read(clientFd, line, sizeof(line)); if(n < 0) { //#define ECONNRESET 104 /* Connection reset by peer */ if(errno == ECONNRESET) { close(clientFd); FD_CLR(clientFd, &fds); printf("异常退出n"); } else { printf("网络异常"); exit(-1); } } else if(n == 0) { close(clientFd); FD_CLR(clientFd, &fds); printf("正常退出n"); } else { line[n] = 0; printf("接收到数据:%sn", line); write(clientFd, szHtmlBuf, sizeof(szHtmlBuf)); } } int main() { struct sockaddr_in cliaddr, servaddr; int listenFd = socket(AF_INET, SOCK_STREAM, 0); if( listenFd < 0) { printf("socket函数执行失败"); return 1; } servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_aton('10.132.10.64', &(servaddr.sin_addr)); //servaddr.sin_addr.s_addr = inet_addr("10.132.10.64"); servaddr.sin_port = htons(SERV_PORT); if(bind(listenFd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { printf("bind函数执行失败"); return 1; } if(listen(listenFd, LISTENQ) < 0) { printf("listen函数执行失败"); return 1; } printf("listen函数执行成功n"); //select 部分 int maxfd; FD_ZERO(&fds); do{ FD_SET(listenFd, &fds); maxfd = listenFd + 1; int nRead = 0; if( (nRead = select(maxfd + 1, &fds, NULL, NULL, NULL)) < 0) { printf("select 失败n"); exit(-1); } printf("select find data Changen"); for(int i = 0; i <= maxfd && nRead > 0; i++) { if(!FD_ISSET(i, &fds)) { continue; } --nRead; if(i == listenFd) { socklen_t clilen = sizeof(cliaddr); int connfd = accept(listenFd, (struct sockaddr*)&cliaddr, &clilen); if(connfd < 0) { if ((errno != EAGAIN) && (errno != EWOULDBLOCK)) { printf( "fail to accept new client n"); continue; } } printf("Ip: %s 到此一游n", inet_ntoa(cliaddr.sin_addr)); FD_SET(connfd, &fds); maxfd = (connfd > maxfd ? connfd : maxfd); } else { echo_srv(i); } } }while(true); return 0; } ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



浙公网安备 33038102330482号