加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

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编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读