标签:ohs amp pre soc max top 并发服务器 最大 tpi
一。select函数原型

二。select实现并发服务器
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<strings.h>
#include<sys/wait.h>
#include<sys/select.h>
#include<string.h>
#define SERV_PORT 8888
#define SERV_IP "192.168.0.109"
void wait_child(int sign)
{
while(waitpid(0,NULL,WNOHANG)>0);
return ;
}
int main()
{
pid_t pid;
int lfd,cfd;
char buf[BUFSIZ];
lfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serv_addr,clie_addr;
socklen_t clie_addr_len;
clie_addr_len=sizeof(clie_addr);
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
//serv_addr.sin_addr.s_addr=htonol(INADDR_ANY); 使用可用的ip
//指定ip 用inet_pton转换
inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr);
bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
listen(lfd,128);
//最大的文件描述符
int maxfd=lfd;
//读集合
fd_set reads,temp;
FD_ZERO(&reads);
FD_SET(lfd,&reads);
while(1)
{
temp=reads;
//委托内核做IO检测
int ret=select(maxfd+1,&temp,NULL,NULL,NULL);
if(ret==-1)
{
perror("select err");
exit(1);
}
//客户端发起了新连接
if(FD_ISSET(lfd,&temp))
{
//接收连接请求
int cfd=accept(lfd,(struct sockaddr*)&clie_addr,&clie_addr_len);
if(cfd==-1)
{
perror("accept err");
exit(1);
}
char buf_ip[BUFSIZ];
printf("ip:%s,port:%d 已经连接\n",inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,buf_ip,sizeof(buf_ip)),ntohs(clie_addr.sin_port));
//将cfd加入读集合
FD_SET(cfd,&reads);
//更新最大的文件描述符
maxfd=maxfd<cfd?cfd:maxfd;
}
//已经连接的客户端有数据到达
for(int i=lfd+1;i<=maxfd;i++)
{
memset(buf,0,sizeof(buf));
if(FD_ISSET(i,&temp))
{
// char buf[BUFSIZ];
int len=read(i,buf,sizeof(buf));
if(len==-1)
{
perror("recv error");
exit(1);
}else if(len==0){
// printf("ip:%s,port:%d 关闭连接",inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,buf_ip,sizeof(buf_ip)),ntohs(clie_addr.sin_port));
close(i);
FD_CLR(i,&reads);
}else{
printf("read buf:%s\n",buf);
write(i,buf,len);
}
}
}
}
}
标签:ohs amp pre soc max top 并发服务器 最大 tpi
原文地址:https://www.cnblogs.com/sclu/p/11306251.html