多路复用 循环服务器模型

#include "header.h"
typedef struct sockaddr SA;
#define MAXLINE 1024

int main(void)
{
	int listen_fd,connect_fd;
	struct sockaddr_in server_addr,client_addr;
	socklen_t length;
	char buf[MAXLINE];
	fd_set rdfs;

	if((listen_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket fail");
		exit(-1);
	}

	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(8000);
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if(bind(listen_fd,(SA *)&server_addr,sizeof(server_addr)) == -1)
	{
		perror("bind fail");
		exit(-1);
	}

	if(listen(listen_fd,10) == -1)
	{
		perror("listen fail");
		exit(-1);
	}

	int i;
	memset(buf,'\0',sizeof(buf));
	
	while(1)
	{
		
		FD_ZERO(&rdfs); //设置监听读写文件的描述符集合,仅在第一次调用select时有效
		FD_SET(STDIN_FILENO,&rdfs);
		FD_SET(listen_fd,&rdfs);		
		printf("select before\n");

		if(select(listen_fd+1,&rdfs,NULL,NULL,NULL) < 0)  //轮询
		{
			perror("select fail");
			exit(-1);
		}

		printf("select after\n");

		for(i = 0; i <= listen_fd;i++)
		{
			if(FD_ISSET(i,&rdfs))
			{
				if(i == STDIN_FILENO)
				{
					fgets(buf,sizeof(buf),stdin);
					printf("receive from stdin %s",buf);
				}
				if(i == listen_fd)
				{
					length = sizeof(client_addr);
					if((connect_fd = accept(listen_fd
						,(SA *)&client_addr
						,&length)) == -1)
					{
						perror("accept fail");
					}
					printf("connect from client IP %s"
						,inet_ntoa(client_addr.sin_addr));
					printf("client port %d\n",ntohs(client_addr.sin_port));
					memset(buf,'\0',sizeof(buf));
					read(connect_fd,buf,sizeof(buf));
					printf("read from client:%s\n",buf);
				}
			}
		}

		close(connect_fd);
	}
	close(listen_fd);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值