网络编程
JanzeeLiu
这个作者很懒,什么都没留下…
展开
-
C++面试之主线程退出子线程会退出吗?
对于WINDOWS系统,主线程退出,其他未执行完毕的子线程也会退出,因为主线程退出调用exit(),相当于终止整个进程,其他线程自然而然会终止; 对于linux系统,主线程退出,其他未执行完毕的子线程不会退出,会继续执行,但是这个进程会编程僵尸进程,通过ps -ef查看进程列表,如果有defunct字样的进程,就是僵尸进程。僵尸进程应该被避免。所以,我们应该在主线程退出之前等待其他子线程执行完毕...原创 2019-08-26 17:19:16 · 4790 阅读 · 2 评论 -
TKeed源码解析之request结构体解析
首先看下HTTP请求报文结构method空格URL空格version回车换行符头部字段名:值回车换行符...头部字段名:值回车换行符回车换行符请求数据其中回车是'\r',换行符是'\n'。具体地可以看一个例子。GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 Ac...原创 2019-09-13 15:24:05 · 414 阅读 · 0 评论 -
TKeed源码之解析request请求头
前面解析了request请求报文的行。现在介绍对请求头的解析,解析就是将头部字段名和对应的值存储起来,存在下面的结构体里面,再把结构体放到链表里。typedef struct tk_http_header{ void* key_start; void* key_end; void* value_start; void* value_end; str...原创 2019-09-13 15:44:10 · 269 阅读 · 0 评论 -
TKeed源码解析之URI解析
前面对request报文请求行和请求头进行了解析,现在来对uri进行解析。uri存在于请求行中,Uniform Resource Identifiers统一资源标识符,用于在互联网上标志一个资源,完整的URI主要由以下三种形式:<scheme>:scehme-specific-part#<fragment><scheme>://<authori...原创 2019-09-13 19:47:00 · 263 阅读 · 0 评论 -
TKeed源码解析之几种头部字段的处理
前面已经对请求行和请求头进行了处理,还有对URI也进行了处理,也处理了资源找不到和资源不允许访问的情况。下面讲一下,对于请求头几种头部字段的处理,头部字段名有这几个类型:Host,Connection,If-Modified-Since和什么都没有;它们都有各自的处理函数。Host:初始URL中的主机和端口。Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Kee...原创 2019-09-13 21:05:32 · 231 阅读 · 0 评论 -
TKeed源码解析之静态文件请求处理
前面做了这几件事:解析请求行 解析请求头 解析URI 对错误情况(404,403)进行处理,并读取了文件的inode信息,存储在结构体里面 处理请求头几种情况,并将请求头的处理结果存在out中 现在来处理静态文件请求先来看下HTTP的响应报文格式。基本由三部分组成:状态行响应头部响应正文协议版本空格状态码空格状态码描述符回车符换行符头部字段名:值回车符换行...原创 2019-09-14 09:17:36 · 305 阅读 · 0 评论 -
线程创建方式
什么是线程? 进程是运行中的程序,多个进程实现了操作系统的并发;多个线程实现了进程的并发,是操作系统进行计算和调度的基本单位,进程有多个线程以完成不同的任务。同一进程下的多个线程共享内存空间和文件描述符等,所以线程之间通信要比进程通信方便的多,但是线程也有自己的独立空间,比如线程栈,它是其他线程不能访问的,线程栈从进程堆上分配内存,通过 ulimit -a可以查看线程栈大小为8M,为了防止其他线...原创 2019-09-15 12:11:30 · 95 阅读 · 0 评论 -
TKeed之webbench测压之request报文的构建
构造request请求行 请求行的请求方法:GET,HEAD,OPTIONS,TRACE 请求行的URL:http://127.0.0.1:3000/index.html 请求行协议版本号:HTTP/0.9、HTTP/1.0、HTTP/1.1 构造request请求头 第一个头部关键字:值 User-Agent: WebBenchUser Agent中文名为用户代理,简称...原创 2019-09-15 16:53:24 · 347 阅读 · 0 评论 -
TKeed之webench之压测
前面介绍了resquest结构体的构建,现在来介绍压测函数的编写。首先介绍webbench的原理,它主要通过fork()函数产生很多子进程,模拟多个客户端, bench(), static int bench(void) static int bench(void){ int i,j,k; pid_t pid=0; FILE *f; /* check...原创 2019-09-15 19:37:16 · 208 阅读 · 0 评论 -
TKeed之处理超时请求
前面使用epoll_wait将就绪事件从内核读取到用户数组里之后,需要处理事件。其中包括对超时事件的处理。tk_handle_expire_timers();tk_pq_t tk_timer;//优先队列是全局变量void tk_handle_expire_timers(){ while(!tk_pq_is_empty(&tk_timer)){ // 更...原创 2019-09-12 16:24:25 · 388 阅读 · 0 评论 -
当你回答进程时你应该回答什么?
什么是进程? 它是运行中的程序,一个程序可以有多个进程,进程包含程序计数器(用来存放下一条指令存放的地址)、寄存器(用来存储指令,数据和地址)、变量当前的值。 进程如何创建? 可以通过系统调用来创建子进程,fork(). pid_t pd;pd=fork(); 该系统调用创建了一个子进程,该子进程拥有与父进程一样的初始状态,PCB相同,用户态代码也相同,数据也相同。此时刚调用完fo...原创 2019-08-30 16:06:37 · 92 阅读 · 0 评论 -
TKeed源码分析之初始化套接字并监听
初始化套接字并监听socket_bind_listen()函数端口port不能是知名端口,也不能大于65535int listen_fd=0;listen_fd=socket(AF_INET,SOCK_STREAM,0);//AF_INET表示使用ipv4协议,SOCK_STREAM表示流式套接字,是基于TCP协议,还有一种是SOCK_DGRAM表示基于数据包的套接字,到达的顺...原创 2019-09-02 14:47:14 · 225 阅读 · 0 评论 -
TKeed源码分析之监听之后数据的接收与连接的关闭
遍历events数组,根据监听种类及描述符类型分发操作tk_handle_events(epoll_fd, listen_fd, events, events_num, conf.root, tp);// 分发处理函数void tk_handle_events(int epoll_fd, int listen_fd, struct epoll_event* events, i...原创 2019-09-02 15:56:21 · 334 阅读 · 0 评论 -
TKeed源码分析之读写数据
socket通信的读写ssize_t Read(int fd, void *buf, size_t count){ ssize_t rc; if ((rc = read(fd, buf, count)) < 0) unix_error("Read error"); return rc;}ssize_t Write(int fd, const v...原创 2019-09-02 17:57:33 · 143 阅读 · 0 评论 -
TKeed之监听模式设置为非阻塞
设置socket套接字为非阻塞int make_socket_non_blocking(int fd){//设置套接字为非阻塞模式 int flag = fcntl(fd, F_GETFL, 0);//获得文件状态标记 if(flag == -1) return -1; flag |= O_NONBLOCK; if(fcntl(fd, F_S...原创 2019-09-02 19:09:54 · 254 阅读 · 0 评论 -
TKeed源码分析之EPOLL边缘触发模式监听事件
EPOLL边缘触发模式监听事件,EPOLL是LINUX特有。众所周知,epoll维护了一个红黑树,来快速查找到有数据到来的fd对应的epoll_event结构体,从而copy给用户态,供用户详细地处理。epoll是linux系统特有的I/O复用函数,epoll使用一组函数来完成任务,而不是单个函数,epoll把用户关心文件描述符放在内核的一个事件表当中,epoll需要使用一个额外的文件描述符来唯...原创 2019-09-03 17:09:53 · 211 阅读 · 0 评论 -
TKeed源码分析之添加listen监听事件
前面初始化监听套接字listen_fd后,现在把它加入到epoll内核事件表当中。// 初始化套接字开始监听 int listen_fd = socket_bind_listen(conf.port); // 设置为socket非阻塞 int rc = make_socket_non_blocking(listen_fd); // 创建epoll并注册监听...原创 2019-09-04 10:11:26 · 297 阅读 · 0 评论 -
TKeed源码分析之循环等待事件发生
采用的系统调用函数是epoll_wait()。 while(1){ // 得到最近且未删除时间和当前时间差值(等待时间) int time = tk_find_timer(); // 调用epoll_wait函数,返回接收到事件的数量 int events_num = tk_epoll_wait(epoll_fd, ev...原创 2019-09-04 11:20:01 · 261 阅读 · 0 评论 -
对于TKeed的一些思考
首先介绍一下线程数目应该创建多少个 应用程序最小线程数应该等于可用处理器核数。 如果所有任务都是计算密集型的,则创建处理器核心数那么多个线程就可以了,在这种情况下,创建更多的线程对程序性能而言反而是不利的,因为当多个任务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能损耗很大;而且线程的创建是需要消耗内存资源的。 如果任务都是IO密集型的,那么我们就需要开更多的...原创 2019-09-20 11:11:02 · 322 阅读 · 0 评论