10-11-12 IO複用及select例子

1. 阻塞式IO


2. 非阻塞式IO


3. IO複用Select / epoll


4. 信號驅動IO


5. 異步IO


6. select示例

#include "socket_includes.h"



int mz_ipv4_tcp_create_socket(void)
{
	int listenfd, sockfd, opt = 1;
	struct sockaddr_in server, client;
	socklen_t len;
	int timep;
	int ret;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if(listenfd < 0){
		perror("Create socket fail.");
		return -1;
	} 

	if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
		perror("Error, set socket reuse addr failed");  
		return -1;
	}

	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port   = htons(SERV_PORT);
	server.sin_addr.s_addr  = htonl(INADDR_ANY);
	
	len = sizeof(struct sockaddr);
	if(bind(listenfd, (struct sockaddr *)&server, len)<0){
			  perror("bind error.");
		return -1;
	}
	
	  
	listen(listenfd, MAX_LISTEN_QUE);

	return listenfd;
}




int main(int argc, char *argv[])
{
	int listenfd, sockfd;
	struct sockaddr_in server, client;
	socklen_t len;
	int bytes =0 ;
	fd_set global_rdfs,current_rdfs;	
	int maxfd;	
	int i;
	char buf[MAX_BUFFER_SIZE];

	len = sizeof(struct sockaddr_in);

	listenfd = mz_ipv4_tcp_create_socket();
	FD_ZERO(&global_rdfs);
	FD_SET(listenfd, &global_rdfs);
	maxfd = listenfd;

	while(1){
		current_rdfs = global_rdfs;
		if(select(maxfd + 1, ¤t_rdfs, NULL, NULL, NULL)<0){
			perror("select error.\n");
			return RT_ERR;
		}

		for(i = 0; i <= maxfd; i++){

			if(FD_ISSET(i, ¤t_rdfs)){
				if(listenfd == i){
					if((sockfd = accept(listenfd, (struct sockaddr*)&client, (socklen_t*)&len))<0){
						perror("accept error.\n");
						return RT_ERR;
					}
					printf("sockfd:%d\n", sockfd);
					FD_CLR(i, ¤t_rdfs);
					maxfd = maxfd > sockfd ? maxfd :sockfd;
					FD_SET(sockfd, &global_rdfs);
				}else{
					printf("read socket:%d\n", i);
					bytes = recv(i, buf, MAX_BUFFER_SIZE, 0);
					if(bytes < 0){
						perror("recv error.\n");
						return RT_ERR;
					}
					if(bytes == 0){
						FD_CLR(i, &global_rdfs);
						close(i);
						continue;
					}
					printf("buf:%s\n", buf);
					send(i, buf, strlen(buf), 0);
				}

			}
		
		}
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章