type
status
date
slug
summary
tags
category
icon
password
Property
Dec 9, 2022 03:42 PM
今天总算是修复了好了所有bug,所有bug都是出现在Go编写的服务端,居然没有Rust的比较神奇。经过昨天的痛苦测试,今天我编写了一个echo服务器来专门测试这种网络软件,效果可以说是还算不错,很快就能定位问题大概是出现在服务端还是客户端哪里的问题。
第一个Bug是出现的情况是服务端编码正常,客户端编码解码正常,但是最后服务端解码不正常,当时我调试的时候发现明明只有三个字节的数据,回显的时候居然返回了一大块,估计有几万个字符。最后找到原因是我没有指定slice读到的字符的数量…可以说是智商问题了。
第二个Bug就非常神奇了,开始软件可以正常运行,但是大概多访问几个网页之后就开始无法使用了。通过回显服务器又发现这个问题又出在服务端的解码阶段???最开始解码是正常的,后面我发现解码器的nonce被突然改变了,被全填成了0,这就很奇怪了,默认我设置的编码器只有一个设置nonce字段的函数,不可能会有别的地方调用,仔细观察还发现是每次客户端发送心跳包的时候nonce才会被改变。我挠头顿足捣鼓了几个小时都不知道原因,后面看到nonce的切片的cap是62,才隐隐约约察觉到nonce可能是被修改了引用,go这个语言slice变量实际上是一个指针,赋值是不会拷贝的,而62这个数字正好是我设计客户端和服务器端交互协议数据字段的长度。后面我把设置nonce字段的方法改成了copy的逻辑,算是解决了。
相比之下Rust就省心不少,但是我写Rust的速度太慢了…写一句代码都得看好几次文档。
- 作者:sdttttt
- 链接:https://www.sdttttt.site/article/d20c9a4d-5872-43b4-bd23-fbdfa9066401
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。