net工程的代码是6月的时候写的:
common/net:
1. net_common_types.h 一些用于跨平台的macro、typedef
2. net_tcp_handler_base.h 网络字节流的数据处理基类 (实现类)
3. net_tcp_server_base.h tcp server的纯虚基类 (接口类)
4. net_tcp_server.h tcp server的基类 (派生类可按需要重写: send_message、handle_message)
5. net_tcp_client.h tcp client的基类 (派生类可按需要重写: send_message、handle_message)
一直不想写测试代码:一是彼时热情度不高,二是烦找BUG。
本来这周是打算学习下opencv的角点检测的,哎,热度不高,尝试回头测试net,怎料到效果不错,热情持续至今。
这周找BUG的过程:
第一天:写完测试代码,开始windows下测试:
问题一、客户端连接不上,查找错误号,很简单:没加WSAStartup函数
问题二、接收到的数据长度信息解析不对:解析时,数据长度信息未做偏移
问题三、程序无法退出:退出代码的一个迭代器未做移动处理
问题四、数据量大时,程序崩溃:内存池长度计算得有问题
问题五、没有代码数据时,tcp_client也总是通知发数据:修改,收到通知后,又发现没数据可写时,取消写事件的通知;有新数据待发时,设定写事件的通知。
问题六、套接字间的数据乱了,有的套接字不发,有的发多次:发送缓存块保存的套接字信息有问题 (由于数据都是对象池来做的,所以数据不是坏的,但却是错的)
问题七、字节流基类的大小端转换错了:判断大小端的代码写反了
问题八、tcp_server的发送通知每次都有两个:去除了IOCP在GetQueuedCompletionStatus处通知的处理 (此解决方案不对)
第二天:继续windows下的测试:
问题一、处理发送完成的数据时,发现,发送的数据量比现有的数据量还多:(导致越界处理,问题时有时无,找了一天),第一天的问题八的处理不当,改为:不对WSASend、WSARecv的结果(传输字节数)处理,全部保留到GetQueuedCompletionStatus时来处理
第三天:继续windows下的测试:
问题一、当单个数据特别大(需要拆分保存)时,程序会崩溃:如果处理完的数据块是最后一个,不能删除它(需要留一个来记录连接信息),改为清理它的发送数据
问题二、改为问题一后,tcp_server总通知写事件,但底层有没有数据用来发送:发送前(不管是post写事件,还是真发送),判断是否有数据,有才发
第四天:开始linux下的测试:
问题一、tcp_server无法退出:EPOLL的缓存数据的buffer_size为0,所以一直无法退出读循环,原因是遗漏了buffer_size的初始化
问题二、处理数据的线程偶尔会崩溃:监听事件对应的数据是空的,修改创建数据处理线程与监听事件的顺序
问题三、一端关闭时,另一端会崩溃:增加对SIGPIPE信号的处理(忽略它),检测到对端关闭(recv 0)时也关闭套接字
目前状况:
一、两个平台下都比较稳定
二、windows下,效率可观;linux下,效率差强人意
最开始是怀疑tcp_server在epoll的哪个地方处理上有效率瓶颈,但也发现tcp_client的发送很慢(但windows下的代码几乎是一样的啊)。。。
-------------------------------------------------------------------------
后续:
问题一、linux下效率不行:发现tcp_server处有一处sleep(1)
问题二、linux下大数据时发送不完全:前一天在tcp_server进行了一处错误的优化,之前用一个events来记录之前的状态,相同时不调用epoll_ctl,显然是错误的
现在基本正常了...