资源简介
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
- 上一篇:数据结构课程设计交通信息管理系统
- 下一篇:智能循迹避障小车源程序C51
评论
共有 条评论