Windows Socket 应用总结

最近做了一个关于socket的小工程,需求:因为特殊要求,客户端要开防火墙,屏蔽掉大部分端口,但服务端需要访问另一个子网的多个设备,并且要把相关信息返回给客户端。原有的客户端和服务端的软件开发已经完成,不便改动。后来经过高手指导,决定在服务端和客户端之间,开一条隧道。途中的双向箭头,代表一条可双向传输数据的TCP链接。


在开发的过程中,总结如下,供大家参考;

1DownTunnel要先启动,UpTunnel要去连DownTunnel,但断开后,不能自动重连,因此单独开一个线程UpTunnel向DownTunnel定时发送心跳,监测UpTunnel与DownTunnel的连接状态,断开则自动重连。

2 每个socket即使是TCP连接,对应的send函数的send出去的每包数据的长度,不一定等于recv的长度,最开始的时候,测试数据长度短,且频率低,我以为就每次send和recv而言数据长度会相等,导致后来发现解析不对,给自己上了一课,不能想当然。

3信息的回馈机制和异常处理,是相当重要的。最开始,只重点考虑了 客户端断开的情况,没有重视设备端主动断开的处理,造成了应用端测试时,出现问题,在查找bug时,带来了干扰。

4很多看上去无关紧要的对socket属性设置的函数,其实非常重要!比如对bolcking和nonblocking模式的设置,开始以为设置nonblocking,可能会使数据传输更流畅,但实际情况是设置了nonblocking,数据量大时,当服务端繁忙处理不过来的时候,反而会使客户端返回send的时候出现错误;还有就是socket的接收和发送的缓存空间大小,都太小了,需要根据实际需求进行设置。还有就是select监听的集合个数最大默认是64个,可以通过宏定义去设置成自己想要的个数。

5 如果程序有while循环,一定注意检查while循环,是否有陷入死循环,耗尽资源的可能。

6思维角度的多样化和设计方法的积累。如上图的示意图,如果要求满足多级级联,该如何抽象成可实现的类?最开始我是把每个Tunnel设计成一个类,后来发现当Tunnel处于不同的层级时,功能差异很大,逻辑也不是很清晰。后来在同事的提醒下,把每一条具体的处理流程的功能设计成一个类,然后处于不同层级的Tunnel根据角色不同,拿不同的功能模块的类成员变量组合,逻辑清晰了很多,代码也简洁了。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值