#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#define SERV_PORT 6666
int main(int argc,char *argc[])
{
int listenfd,connfd;
char buf[BUFSIZE];
struct sockaddr_in clie_addr,serv_addr;
socklen_t clie_addr_len;
listenfd=socket(AF_INET,SOCK_STREAM,0);
int opt=1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERV_PORT);
bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
listen(listenfd,128);
fd_set rset,allset;
int ret,maxfd=0;
maxfd=listenfd;
FD_ZERO(&allset);
FD_SET(listenfd,&allset);
while(1)
{
rset=allset;
ret=select(maxfd+1,&rset,NULL,NULL);
if(ret<0)
{
perr_exit("select error");
}
if(FD_ISSET(listenfd,rset)){
clie_addr_len=sizeof(clie_addr);
connfd=accept(listenfd,(struct sockaddr*)&clie_addr,&clie_addr_len);
FD_SET(connfd,&allset);
if(maxfd<connfd)
maxfd=connfd;
if(ret==1)//说明select只返回一个,并且是listenfd,后续执行无需执行
{
continue;
}
}
for(i = listenfd;i<maxfd+1;i++)
{
if(FD_ISSET(i,&rset)){
n=read(i,buf,sizeof(buf));
if(n==0){
close(i);
FD_CLR(i,&allset);
}
else if(n==-1)
{
perr_exit("read error");
}
else{
for(int j=0;j<n;j++)
buf[j]=toupper(buf[j]);
write(i,buf,n);
write(STDOUT_FILENO,buf,n);
}
}
}
}
close(listenfd);
return 0;
}
select在项目中应用代码实现
最新推荐文章于 2024-05-21 09:31:27 发布