[common-sln]: net工程初步完成

22 篇文章 0 订阅
20 篇文章 0 订阅
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,显然是错误的


现在基本正常了...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值