• 大小: 34KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: C/C++
  • 标签: C语言http  

资源简介

C 语言实现的http文件上传下载服务 系统平台:windows 开发工具:vs2010 开发语言:C 程序为单线程,使用I/O多路复用实现并发 抽取libevent的最最最基础框架,自己封装event 使用BSD tree.h的红黑树

资源截图

代码片段和文件信息

#include “httpd.h“
#include “tree.h“


struct rbnode_t {
    RB_ENTRY(rbnode_t) node;
    event_t           *ev;
};
RB_HEAD(rbtree_t rbnode_t) _read_evs _write_evs _except_evs;

fd_set           _readfds                   = { 0 };
fd_set           _writefds                  = { 0 };
fd_set           _exceptfds                 = { 0 };
struct rbnode_t *_active_ns[FD_SETSIZE * 3] = { 0 };
uint32_t         _active_size               = 0;

static int  compare(struct rbnode_t *n1 struct rbnode_t *n2);
RB_PROTOTYPE(rbtree_t rbnode_t node compare);
RB_GENERATE(rbtree_t rbnode_t node compare);
static struct rbnode_t *create_rbnode(event_t *ev);
static struct rbnode_t *find_rbnode(uint32_t fd struct rbtree_t *t);
static void release_rbnode(struct rbnode_t *n);
static void release_rbtree(struct rbtree_t *t);
static int  event_del_by_fd(uint32_t fd struct rbtree_t *t fd_set *s);
static int  rbnode_del_no_free(struct rbnode_t *n);

ret_code_t event_init()
{
    RB_INIT(&_read_evs);
    RB_INIT(&_write_evs);
    RB_INIT(&_except_evs);
    FD_ZERO(&_readfds);
    FD_ZERO(&_writefds);
    FD_ZERO(&_exceptfds);
    memset(_active_ns 0 sizeof(struct rbnode_t*) * FD_SETSIZE * 3);
    _active_size = 0;
    return SUCC;
}

ret_code_t event_uninit()
{
    release_rbtree(&_read_evs);
    release_rbtree(&_write_evs);
    release_rbtree(&_except_evs);
    FD_ZERO(&_readfds);
    FD_ZERO(&_writefds);
    FD_ZERO(&_exceptfds);
    memset(_active_ns 0 sizeof(struct rbnode_t*) * FD_SETSIZE * 3);
    _active_size = 0;
    return SUCC;
}

ret_code_t event_add(event_t *ev)
{
    struct rbnode_t  k;
    struct rbnode_t *n = NULL;
    struct rbtree_t *t = NULL;
    fd_set          *s = NULL;
    if (ev->type & EV_READ)
    {
        t = &_read_evs;
        s = &_readfds;
    }
    else if (ev->type & EV_WRITE)
    {
        t = &_write_evs;
        s = &_writefds;
    }
    else if (ev->type & EV_EXCEPT)
    {
        t = &_except_evs;
        s = &_exceptfds;
    }
    if (!t || !s)
    {
        log_error(“{%s:%d} invalid params“ __FUNCTION__ __LINE__);
        return PARA;
    }

    if (s->fd_count >= FD_SETSIZE)
    {
        log_warn(“{%s:%d} event map is full“ __FUNCTION__ __LINE__);
        return FULL;
    }
    k.ev = ev;
    n = RB_FIND(rbtree_t t &k);
    if (n)
    {
        log_warn(“{%s:%d} event is already exist fd=%d“ __FUNCTION__ __LINE__ ev->fd);
        return EXIS;
    }
    n = create_rbnode(ev);
    if (!n)
    {
        return FAIL;
    }
    RB_INSERT(rbtree_t t n);
    FD_SET(ev->fd s);
    return SUCC;
}

ret_code_t event_del(event_t *ev)
{
    uint32_t fd = ev->fd;
    event_del_by_fd(fd &_read_evs &_readfds);
    event_del_by_fd(fd &_write_evs &_writefds);
    event_del_by_fd(fd &_except_evs &_exceptfds);
    return SUCC;
}

ret_code_t event_dispatch()
{
    fd_set readfds;
    fd_set writefds;
    fd_set e

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         882  2018-09-25 14:19  httpd.sln
     文件        7787  2018-09-28 10:21  httpd\event.c
     文件        1298  2018-09-28 13:36  httpd\event.h
     文件       30914  2018-09-29 14:03  httpd\http.c
     文件          85  2018-09-26 10:10  httpd\http.h
     文件         589  2018-09-29 13:07  httpd\httpd.h
     文件        4510  2018-09-29 14:15  httpd\httpd.vcxproj
     文件        2155  2018-09-29 14:15  httpd\httpd.vcxproj.filters
     文件        2795  2018-09-29 13:07  httpd\logger.c
     文件         359  2018-09-27 14:29  httpd\logger.h
     文件        1324  2018-09-28 11:01  httpd\main.c
     文件        3856  2018-09-29 13:41  httpd\network.c
     文件         372  2018-09-29 13:41  httpd\network.h
     文件       45308  2015-01-05 22:34  httpd\tree.h
     文件         470  2018-09-28 09:55  httpd\types.h
     文件        2741  2018-09-28 13:01  httpd\utils.c
     文件         425  2018-09-28 12:36  httpd\utils.h
     文件       27136  2018-09-29 14:15  httpd.exe

评论

共有 条评论