在学习Linux高并发web服务器开发总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
11_服务器开发-第03天(web服务器 - 3)
目录:
一、学习目标
二、 复习
三、strftime函数
四、libevent实现httpserver
五、线程池
1、线程池的原理
2、线程池各个函数分析
附—整体代码
一、学习目标
1、libevent实现httpserver
2、线程池
二、 复习
1、epoll服务器端代码
三、strftime函数
》使用:
char buf[1024];
strftime(buf, sizeof(buf), "%Y %b %d %H %M %S", st.st_mtime);//把st.st_mtime按双引号中格式 格式化到buf中。
》类似于QT中(QDateTime、QTime、QDate):如调用QDateTime后,然后toString("yy MM dd")把QDatetime转为特定格式
如获取本地时间:
QDateTime d(QDateTime::currentDateTime());
qDebug()<<d.toString("yy.MM.dd") ;
四、libevent实现httpserver
》技巧:在vim中点击“F4”查看所有函数,在右侧垂直分屏显示,点击“Ctrl+w+w”切换分屏到右侧函数。
>main.c
#include <stdio.h> #include <unistd.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <event2/bufferevent.h> #include <event2/listener.h> #include <event2/event.h> #include "libevent_http.h" int main(int argc, char **argv) { if(argc < 3) { printf("./event_http port path\n"); return -1; } if(chdir(argv[2]) < 0) { printf("dir is not exists: %s\n", argv[2]); perror("chdir err:"); return -1; } struct event_base *base; struct evconnlistener *listener; struct event *signal_event; struct sockaddr_in sin; base = event_base_new();//创建事件处理框架 if (!base) { fprintf(stderr, "Could not initialize libevent!\n"); return 1; } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(atoi(argv[1])); //服务器端创建2个套接字 // 创建监听的套接字,绑定,监听,接受连接请求 listener = evconnlistener_new_bind(base, listener_cb, (void *)base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&sin, sizeof(sin)); if (!listener) { fprintf(stderr, "Could not create a listener!\n"); return 1; } // 创建信号事件, 捕捉并处理 signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base); if (!signal_event || event_add(signal_event, NULL)<0) { fprintf(stderr, "Could not create/add a signal event!\n"); return 1; } // 事件循环 event_base_dispatch(base); evconnlistener_free(listener); event_free(signal_event); event_base_free(base); printf("done\n"); return 0; }