#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);
}
多路复用 循环服务器模型
最新推荐文章于 2022-10-19 02:02:20 发布