#include <stdio.h>
#include <ctype.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <assert.h>
#include <sys/time.h>
#include <sys/select.h>
#define SERV_PORT 6666
int main(){
int listenfd, connfd;
struct sockaddr_in serv_addr, clit_addr;
char buf[BUFSIZ];
listenfd = socket(AF_INET, SOCK_STREAM, 0);
int max_fd = listenfd;
int opt = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
listen(listenfd, 128);
fd_set reads, temp_reads;
FD_ZERO(&temp_reads);
FD_SET(listenfd, &temp_reads);
while(1){
reads = temp_reads;
int ret = select(max_fd + 1, &reads, NULL, NULL, NULL);
if(FD_ISSET(listenfd, &reads)){
puts("fuck");
socklen_t clit_addr_len = sizeof(clit_addr);
connfd = accept(listenfd, (struct sockaddr *)&clit_addr, &clit_addr_len);
FD_SET(connfd, &temp_reads);
if(connfd > max_fd) max_fd = connfd;
if(ret == 1){
continue;
}
}
for(int i = listenfd + 1; i <= max_fd; i++){
if(FD_ISSET(i, &reads)){
int read_len = read(i, buf, sizeof(buf));
if(read_len == 0){
FD_CLR(i, &temp_reads);
close(i);
continue;
}
for(int j = 0; j < read_len; j++){
buf[j] = toupper(buf[j]);
}
write(STDOUT_FILENO, buf, read_len);
write(connfd, buf, read_len);
}
}
}
close(listenfd);
return 0;
}