select例子

好长时间没有写了,其实一直在坚持学习。

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;
    int result;
    fd_set readfds, testfds;

    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);//允许任何ip连接
    server_address.sin_port = htons(9734);
    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){
        char ch;
        int fd;
        int nread;

        testfds = readfds;

        printf("server waiting\n");

        result = select(FD_SETSIZE, &testfds,  (fd_set*)0, (fd_set*)0, (struct timeval*)0);//时间指针为0:表示一直阻塞,如果返回小于1表示程序出错
        if(result < 1){
            perror("server5");
            exit(1);
        }

        for(fd = 0; 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("adding client on fd %d\n", client_sockfd);
                }else{
                    ioctl(fd, FIONREAD, &nread);

                    if(nread == 0){//读到0字节表示客户端断开socket
                        close(fd);
                        FD_CLR(fd, &readfds);//将套接字从集合中清除
                        printf("removing client on fd %d\n", fd);
                    }else{
                    
                        read(fd, &ch, 1);
                        sleep(5);
                        printf("serving cient on fd  %d\n", fd);
                        ch++;
                        write(fd, &ch, 1);
                    }

                }
            }
        }

    }


}

 

posted @ 2016-08-27 23:38  zzyoucan  阅读(1546)  评论(0编辑  收藏  举报