多路复用 循环服务器模型

来源:互联网 发布:c语言编译器好用的 编辑:程序博客网 时间:2024/05/20 07:51
#include "header.h"typedef struct sockaddr SA;#define MAXLINE 1024int 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);}


原创粉丝点击