1. 多线程环境下socket首次失败,报告socket未初始化
#include "hv/hsocket.h"
//主动初始化hv socket
WSAInit();
2. HttpServer 静态服务(Static)不支持中文,大文件可能崩溃
根本原因在于path编码没有统一。
- hv_open将utf8 paht转换为wchar_t
- HttpHandler::openFile 未转换path,所以打开会失败。
- FileCache::Open 未转换path,所以文件打开会失败
支持中文:统一文件打开编码
大文件崩溃:特殊情况,modify 将st成员变量修改,prepend_header
导致数据异常(不发送文件,构建应答头越界)
file_cache_s
FileCache::Open
3. 定时器使用不当
错误demo,重试策略:一次延迟1s,最长30s直至事件成功。
int try_count = 0;
//do something
if(not success)
m_loop->setTimerInLoop((try_count >= 30 ? 30: ++try_count) *1000 , cb, INFINITE, 0x100);
表现现象
cpu 爆了
内存爆了
总结原因
hv内部代码bug,虽然timerid
相同但依旧会再次创建htimer_t
,上一次的htimer_t
并未释放和删除。所以会累积越来越多的定时器,导致cpu和内存都爆了。
代码修复 EventLoop.h
代码分析
此时将会导致连个问题:
htimer_t对象内存泄露 内存 boom
定时器未释放,导致定时器积累月累越多,cpu boom
4. tcp 重连策略不当
内存飞涨,但不会爆,因为部分fd会重复使用
c版本 错误demo
static void reconnect_timer_cb(htimer_t* timer) {
tcp_client_t* cli = (tcp_client_t*)hevent_userdata(timer);
if (cli == NULL) return;
cli->reconn_timer = NULL;
tcp_client_reconnect(cli);
}
由于上一个socket的hio_t未释放,依旧保存在loop里面。只有hloop_cleanup
调用才会释放hio。
修复代码
由于
hio_free
未导出,所以需要对hio_free导出。
HV_EXPORT void hio_free(hio_t* io);
c++版本 TcpClient.h
修复代码
5.日志乱码
因为日志单条限制大小为16k
修复代码
logger_print
函数
`