⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echo_server_select.c

📁 select函数在linux下的应用
💻 C
字号:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
//利用select函数来实现单进程tcp回显服务器
int main(int argc, char *argv[])
{
	struct sockaddr_in ser_addr,client_addr;
	int listenfd,connfd,maxfd;
	fd_set  rset,allset;
	int client[FD_SETSIZE];
	char buffer[512];
	int i=0,index_i;
	int read_count=0;
	int addr_len=sizeof(struct sockaddr_in);
	memset(buffer,0,sizeof(buffer));
	listenfd=socket(AF_INET,SOCK_STREAM,0);
	ser_addr.sin_family=AF_INET;
	ser_addr.sin_port=htons(6666);
	ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	bind(listenfd,(struct  sockaddr*)&ser_addr,addr_len);
	listen(listenfd,5);
	for(i=0;i<FD_SETSIZE;i++)
	{
		client[i]=-1;
	}
	maxfd=listenfd;
	FD_ZERO(&allset);
	FD_SET(listenfd,&allset);
	while(1)
	{
			rset=allset;
			select(maxfd+1,&rset,NULL,NULL,0);
			if(FD_ISSET(listenfd,&rset))
			{
				connfd=accept(listenfd,(struct sockaddr *)&client_addr,&addr_len);
				for (i=0;i<FD_SETSIZE ;i++ )
				{
						if(client[i]==-1)
						{
							 client[i]=connfd;
							 index_i=i;
							 break;
						}
				}
				maxfd=connfd;
				FD_SET(connfd,&allset);
				if (index_i<i)
				{
						index_i=i;
				}
			}
	
			for (i=0;i<=index_i ;i++ )
			{
					if ( (connfd=client[i])>0)
					{	
							if (FD_ISSET(connfd,&allset))
							{
									memset(buffer,0,sizeof(buffer));
									 read_count=read(connfd,buffer,sizeof(buffer));
									 if (read_count==0)
									 {
										   close(connfd);
										   FD_CLR(connfd,&allset);
											client[i]=-1;
											printf("client disconnect!\n");
											break;
											
									 }
									else if (read_count>0)
									{
										 write(connfd,buffer,strlen(buffer));	
									}
							}
					}
			}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -