zoukankan      html  css  js  c++  java
  • 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
    ");
    
            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
    ", client_sockfd);
                    }else{
                        ioctl(fd, FIONREAD, &nread);
    
                        if(nread == 0){//读到0字节表示客户端断开socket
                            close(fd);
                            FD_CLR(fd, &readfds);//将套接字从集合中清除
                            printf("removing client on fd %d
    ", fd);
                        }else{
                        
                            read(fd, &ch, 1);
                            sleep(5);
                            printf("serving cient on fd  %d
    ", fd);
                            ch++;
                            write(fd, &ch, 1);
                        }
    
                    }
                }
            }
    
        }
    
    
    }
  • 相关阅读:
    djangorestframework的源码认证流程
    centos7 docker更换源地址(阿里云)
    vue 递归 无限极
    Linux文件属性及如何改变文件属性和权限
    centos7 安装docker
    centos7 mysql5.7 忘记密码
    git push 单个文件时超过100M报错,解决方案
    python中的依赖包--导出与安装
    18-----cmdb需求规划以及表结构设计
    17-----vue前端权限管理
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/5814094.html
Copyright © 2011-2022 走看看