您的位置:首页 > 其它

多路复用 循环服务器模型

2011-08-25 22:45 190 查看
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: