📄 echo_server_select.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 + -