#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <pthread.h>
#include<sys/select.h>
#include<ctype.h>
#define SERV_PORT 6666
int main()
{
int listen_fd,confd;
char buf[1024];
int n;
struct sockaddr_in clit_addr,serv_addr;
socklen_t clit_addr_len;
listen_fd=socket(AF_INET,SOCK_STREAM,0);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(listen_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
listen(listen_fd,128);
fd_set rset,allset;
FD_ZERO(&allset);
FD_SET(listen_fd,&allset);
int ret,maxfd=0;
while(1)
{
rset=allset;
ret=select(maxfd+1,&rset,NULL,NULL,NULL);
if(ret>0)
{
if(FD_ISSET(listen_fd,&rset))
{
clit_addr_len=sizeof(confd);
confd=accept(listen_fd,(struct sockaddr *)&clit_addr,&clit_addr_len);
FD_SET(confd,&allset);
if(maxfd<confd)
{
maxfd=confd;
}
if(ret==1) //select只返回了一个,而且是listenfd无需执行下面代码直接返回就好
{
continue;
}
for(int i=listen_fd+1;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
{
for(int j=0;j<n;j++)
{
buf[j]=toupper(buf[j]);
}
write(i,buf,n);
write(STDERR_FILENO,buf,n);
}
}
}
}
}
}
}