title:用线程池实现的http服务器
从main函数看起
- 解析ip地址(点分制, 端口号)
- 设置忽略SIGPIPE信号
- 初始化线程池,池中创建了8个线程,每个线程对应一个work函数
- 初始化http逻辑任务处理对象(65535个,为什么需要分配这么多????)
- 初始化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);