首页 > 其他 > 详细

项目 rev覆盖问题

时间:2014-04-25 11:40:06      阅读:505      评论:0      收藏:0      [点我收藏+]

师兄说:

 ”一个rev只有一个old——handler
也就是只能挂起一次
如果这个还没处理完
就有新的来了
那么之前的数据就被覆盖掉了
不知道一个请求意味着什么
这块我还不确定 “
所以需要看看 rev的根源。
 
void ss5_event_accept(ss5_event_t *ev)
ls->connection_handler(c);
看了ss5_event_accept函数的源码,发现只有在accept之后才会获取一个c。

static ss5_listening_t *ss5_socks_add_listening(ss5_conf_t *cf,
ss5_socks_conf_addr_t *addr)中:

ls->connection_handler = ss5_socks_init_connection;

所以上面的ls->connection_handler(c);实际运行的是ss5_socks_init_connection(c);

 
 
void ss5_socks_init_connection(ss5_connection_t *c)
rev = c->read_event;
rev->handler = ss5_socks_init_request;
 紧接着在函数退出前调用了rev->handler(rev);
static void ss5_socks_init_request(ss5_event_t *rev)中
rev->handler = ss5_socks_handler;
 紧接着在函数退出前调用了ss5_add_timer(rev, c->listening->post_accept_timeout);
而所有的工作进程都会运行
void ss5_event_expire_timers(void);用于处理定时器上的事件。
在该函数中,有如下语句,就是调用事件的处理函数,并且参数就是事件。
ev->handler(ev);
所以实际上工作进程会运行如下函数ss5_socks_handler(rev)。
 
void ss5_socks_handler(ss5_event_t *rev)中:
 

ssize_t n;
ss5_int_t rc;
ss5_connection_t *c;
ss5_socks_request_t *r;
ss5_socks_connection_t *sc;

c = rev->data;
sc = c->data;
r = sc->request;

......................

rc = ss5_socks_parse_request_line(r, r->header_in);

ss5_int_t ss5_socks_parse_request_line(ss5_socks_request_t *r, ss5_buf_t *b)

中有:c = r->connection;

rev = c->read_event;

.......

rev->handler = ss5_socks5_handler;

ss5_socks5_handler就会调用

ss5_socks5_process_handler(rev); //这里开始处理请求一直用的是rev

 

bubuko.com,布布扣

项目 rev覆盖问题,布布扣,bubuko.com

项目 rev覆盖问题

原文:http://www.cnblogs.com/mowangchuzhong/p/3687623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!