• 读Linux高性能服务器编程-12章http服务器源码


    title:用线程池实现的http服务器

    从main函数看起

    1. 解析ip地址(点分制, 端口号)
    2. 设置忽略SIGPIPE信号
    3. 初始化线程池,池中创建了8个线程,每个线程对应一个work函数
    4. 初始化http逻辑任务处理对象(65535个,为什么需要分配这么多????)
    5. 初始化socket

          socket函数原型 int socket(int af, int type, int protocol);

           af    AF_INET或者AF_INET6,分别表示IPv4地址或者IPv6地址,或者可以为PF_INET(与AF_INET区别是理论上建立socket时是指定协议,应该用PF_INET,设置地址时应该用AF_INET)

           type 为数据传输方式/套接字类型,常用的有 SOCK_STREAM(流格式套接字/面向连接的套接字) 和 SOCK_DGRAM(数据报套接字/无连接的套接字)

             protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。

             setsockopt函数原型 int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); manipulate options for the socket referred to by the file descriptor sockfd(手动设置socket指定文件描述符                         选项)

            sockfd  socket文件描述符

            level    指定网络协议protocol number,比如TCP协议对应的是SOL_SOCKET

            optname  SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回.

            optval 根据optname传递参数

            oplen sizeof(optval)

          inet_pton man inet_pton

                       hton man hton

             bind man bind

          listen man listen

      6. epoll初始化

        创建epoll实例 

        epoll_create(int size)

          size之前用于表示要监视的文件描述符个数,现在只需要大于0即可,因为内核可以动态获取数据结构的大小

        控制epoll

        epoll_ctrl(int epfd, int op, int fd, struct epoll_event *event);

          epoll_ctl( epollfd, EPOLL_CTL_ADD, fd, &event ); // EPOLL_CTL_ADD把fd所指向的socket描述符添加到epollfd指定的epoll监听实例集中.
       7.  等待epoll实例关联的文件描述符上的事件
        epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
          timeout -1表示调用将一直等待到有事件发生才能返回(阻塞 block indefinitely)
  • 相关阅读:
    继承和多态
    访问限制
    返回函数
    类和实例
    requests
    函数的参数
    代码块的快速放置
    19进阶、基于TSP的直流电机控制设计
    18进阶、TLC语言
    17高级、Simulink代码生成技术详解
  • 原文地址:https://www.cnblogs.com/xl-cnblog/p/13097787.html
Copyright © 2020-2023  润新知