IO多路复用-Select

来源:互联网 发布:网络封包 编辑:程序博客网 时间:2024/06/07 23:36
#include<stdio.h>                                                                                                                                                                                                                                                             #include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<sys/time.h>#include<sys/ioctl.h>int main(){    int server_sockfd,client_sockfd;    int server_len,client_len;    struct sockaddr_in server_address,client_address;    int result;    char ch[1024];    fd_set readfds,testfds;    //memset(ch,'\0',sizeof(ch));    server_sockfd = socket(AF_INET,SOCK_STREAM,0);    server_address.sin_family = AF_INET;    server_address.sin_addr.s_addr = INADDR_ANY;    server_address.sin_port = htons(8888);    server_len = sizeof(server_address);    bind(server_sockfd,(struct sockaddr *)&server_address,server_len);    listen(server_sockfd,5);    FD_ZERO(&readfds);    FD_SET(server_sockfd,&readfds);    while(1){        printf("server waiting\n");        testfds = readfds;        //阻塞        select(FD_SETSIZE,&testfds,(fd_set *)0,(fd_set *)0,(struct timeval *)0);        int fd = 0;        int nread;        int len;        //循环所有的文件描述符        for(fd ; fd < FD_SETSIZE; fd++){            //活动状态            if(FD_ISSET(fd,&testfds)){                //如果是服务端 那么就是新的客户端链接 加入描述符表                if(fd == server_sockfd){                    client_len = sizeof(client_address);                                client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);                    FD_SET(client_sockfd,&readfds);                    printf("添加了一个客户端链接\n");                }                //否则就是客户端的                else{                    //客户端退出 表中删除对应描述符                    ioctl(fd,FIONREAD,&nread);                    if(nread == 0){                        close(fd);                        FD_CLR(fd,&readfds);                        printf("删除了一个客户端链接\n");                    }else{                        //操作对应描述符                        len = read(fd,&ch,1024);                        write(fd,&ch,len);                        if(strncasecmp(ch,"stop",4) == 0){                            close(fd);                            break;                        }                    }                   }            }        }    }}                                                                  
0 0
原创粉丝点击