在学习Linux高并发web服务器开发总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

11_服务器开发-第03天(web服务器 - 3)

目录:
一、学习目标
二、 复习
三、strftime函数
四、libevent实现httpserver
五、线程池
1、线程池的原理
2、线程池各个函数分析
附—整体代码

 

一、学习目标

1、libevent实现httpserver

2、线程池

 

二、 复习

1、epoll服务器端代码

 

三、strftime函数

Linux高并发web服务器开发——web服务器-3

Linux高并发web服务器开发——web服务器-3

    Linux高并发web服务器开发——web服务器-3

》使用:

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;
}
main.c

相关文章: