继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【学习打卡】第6天 构建基于TCP协议的文件传输系统_3

weixin_慕斯636612
关注TA
已关注
手记 34
粉丝 2
获赞 15

一、课程信息

打卡时间:2022.8.8
课程名称:C/C++气象数据中心实战,手把手教你做工业级项目
章节名称:开发基于tcp协议的文件传输子系统
讲师: 长歌_吴从周

二、今日课程

课程内容:(1)结束客户端上传程序以及服务端相应上传业务 (2)学会了gdb调试的技巧

三、学习心得

3.1 结束客户端上传程序以及服务端相应上传业务

在写代码的时候碰到了一些小疑问,比如为什么有了TcpServer.Read()/Write()、TcpClient.Read()/Write(),为什么在写代码的时候却使用Readn和Writen函数?原因是TcpServer.Read()/Write()、TcpClient.Read()/Write()会给报文加上报头,以解决粘包问题。传文件内容的时候,不需要报头,也不关心粘包问题,所以可以选择较为简单的Readn和Writen函数。
在写文件传输子系统代码的时候,设置临时文件非常重要。在上传业务中,上传数据会先存在临时文件中,等传输完毕再将临时文件命名为正式文件。这样做的好处是在如何客户端程序意外中断导致上传数据不完整,不会影响到正式数据,后续可以再次传输。
由于老师提供的框架中UpdateStr函数使用char数组作为局部变量,这可能会存在内存溢出的问题,因此我使用了string对程序进行了改进并命名为UpdateStr_string。
在调试程序的过程中,filesever程序不正常退出,后续再次调用filesever程序发现一直bind不成功。当一个进程不正常退出时,bind失败的问题要考虑到端口被占用的问题,但发现端口被进程占用可以用kill命令强制杀死进程。
查看端口是否被占用的命令是:

netstat -tunlp |grep 端口号

3.2 学会了gdb调试的技巧

总结来说就是多打log,老师提供的logfile类非常好用,多在一些关键地方打log,同时要学会用二分法排查bug,通过log或者printf快速定位到出bug的位置。大多数问题都是在一些微小处不好发现,这时候log的重要性就体现出来了。特别注意,对于客户端上传到服务器中的文件路径,要提前在服务器用mkdir创建好,因为实际开发过程中往往是要在指定的目录下创建文件,如果写的服务器程序会主动创建目录会造成不必要的麻烦。
在程序调试好之后注释掉多余的log,让日志尽量简洁明了。

四、学习截图

图片描述
图片描述

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP