0
点赞
收藏
分享

微信扫一扫

select多路IO复用实现的server

seuleyang 2022-02-17 阅读 31
#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); //caution : max_fd + 1!!!
		
		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); //close_wait->last_ack
					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;
}


举报

相关推荐

0 条评论