代码拉取完成,页面将自动刷新
同步操作将从 hotmocha/sbalance 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/********* 监听端口 **********/
0. 初始化监听的事件处理函数为sb_accept_event
/********* 监听事件(sb_listen), 最后一位区分**********/
(void*)((unsigned long)li|0x1);
1. sb_accept_event->sb_try_connect_server 中 connect EAGAIN
客户端读事件: sb_transfer_read_not_send_event
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_test_connect_complete
1. sb_test_connect_complete 返回成功
a. 客户端没有关闭
客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: sb_transfer_write_event(如果在connect成功之前有数据接收) or NULL
b. 客户端已经关闭
客户端读事件: NULL
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_transfer_write_event(如果在connect成功之前有数据接收) or sb_finish_session(@@结束@@)
2. sb_test_connect_complete 返回失败
a. sb_connect_server_failed 判断之前没有connect失败,调用 sb_try_connect_server
这里需要注意写事件需要重新注册
b. 之前已经失败过一次,sb_finish_session(@@结束@@)
2. sb_accept_event->sb_try_connect_server 中 connect OK
客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: NULL
/********* 数据传输端口事件(sb_session) **********/
当connect服务器成功后:
情况1: 客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: NULL
情况2: 客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: sb_transfer_write_event
情况3: 客户端读事件: NULL
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_transfer_write_event
以接收驱动发送
sb_transfer_read_event(区分缓冲区:用户缓冲区和TCP内部缓冲区):
1. recv时: 用户缓冲区满, send时: 发送用户缓冲区所有数据 ====> continue
2. recv时: 用户缓冲区满, send时: 内部缓冲区满 ====> in.recv.read_ready = 1; out.write 事件handler sb_transfer_write_event
3. recv时: 接受结束, send时: 发送用户缓冲区所有数据 ====> sb_finish_session(@@结束@@)
4. recv时: 接受结束, send时: 内部缓冲区满 ====> in->read.shutdown = 1; out.write 事件handler sb_transfer_write_event(why not finish session)
5. recv时: 内部缓冲区空, send时: 内部缓冲区满 ====> in->read.read_ready = 0; out.write 事件handler sb_transfer_write_event
6. recv时: 内部缓冲区空, send时: 发送用户缓冲区所有数据 ====> in->read.read_ready = 0; delete out.write 事件
7. recv时或者send时时出错 ====> sb_finish_session(@@结束@@)
sb_transfer_write_event:
1. send时: 发送用户缓冲区所有数据 ====> a. delete out.write 事件;
b. 如果 in->read.shutdown = 1, sb_finish_session(@@结束@@)
c. in->read.read_ready = 1, 手工调用 sb_transfer_read_event(why)
2. send时: 发送部分数据 ====> 手工调用 sb_transfer_read_event
3. send时: 出错 ====> sb_finish_session(@@结束@@)
/********* 超时管理 **********/
1. 当connect返回EAGAIN, 将超时时间添加到RBTREE中
2. 当accept返回系统文件描述符不够用,将accept_delay延时添加到RBTREE中
3. 当后台服务器连续多次连接失败,将timeout_delay添加到RBTREE中
4. 自定义其他的时间事件
/********* 配置文件 **********/
accept_delay:1000ms
rule-baidu
{
connect_timeout: 120ms
listen: 127.0.0.1:8882
client: 127.0.0.[1-23]:*,192.168.1.2:*
balance: rr
server
{
115.239.211.112:80(weight=1;max_fails=2;fail_timeout=30s)
}
}
1. 支持 * 和 [] 两种通配符
2. 随机选取服务器可以添加权重
3. 配置负载均衡算法
4. 配置各种超时
/********* 信号 **********/
1. SIGHUP 显示当前的配置信息
2. SIGINT 重新加载配置文件
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。