• 调试一个socket通信bug的心理过程和反思


    背景交代。最近在玩lua的服务端编码, 有项目A,B,AB都是同一个模子的。我手上有A的winsocket客户端和服务端的代码,B项目早期的一份linux下的lua client。服务端、客户端都是LUA。
    目标:调通B的client供我在Linux下对A做测试。
    顺便加强对A项目的认识,主要是通讯层。根据个人经历,这类项目,最难搞定和最难缠的通常也是因为网络通讯导致的bug。
     
    最难的问题是这样的,在修复了各种简单的问题后。出现了一个难缠。
    在登录成功后,向服务器端发出的一个邮件列表请求,始终收不到 !
     
    15.PM ----开始
    猜测1.邮件服务未收到请求?
    查看邮件服务日志后,发现有收到该请求,并且在日志上有回应的记录。
     
    猜测2.本地socket没有收到该消息?
    但是请求登录的消息能够正常返回我登录信息!这个我能收到为什么下一个不能?
    暂时排除。
     
    感觉应该是socket接收数据有问题。打算第二天用另一个基础socket库替换当前socket基础模块。
     
    15.PM ----结束
     
    16.AM ----开始
    早上来一运行,发现尼玛。这次比之前多接收了1条数据,这1条数据是,一登录,系统会自动发送给客户端1个消息,这个消息是你没有阅读的邮件,指示是否有未读的邮件。瞬间又蒙蔽了。
     
    猜测3.服务器端并未真正返回消息?
    Linux安装了wireshark,开始拦包分析。由于消息已被加密,又去找到模块解密了。
    发现能够正常的返回包。再想想也对,我开了A的WIN下的客户端,一运行发现是能够取到邮件的。
     
    返回到猜测2。
    再无数次重复阅读和理解,推算他的接收包的逻辑是否有问题?!
    调试过程中还出现一个状况,解包的代码报错!这又让我有点怀疑他的解包代码不符合A项目了。
    又是一番研读。
    16.AM ----结束
     
     
    16.PM ----开始
    准备继续搞的时候,老大叫我去C项目帮忙。
    把C项目的代码check out下来。这个时候我犹豫了半个小时,是该继续调试这个BUG还是逃避去看另一个项目,反正1.我不做client调通对我“意义”不大,2.我已经搞定了登录,邮件也差不多嘛。通讯的大概我也知道了。另一个思想在斗争:1.如果不去理解他,至少调通他,那么我永远就是一个菜鸟,凭什么牛逼?2.我百度到了别人讨论的各种socket性能优化,一脸蒙蔽,无比羞愧。。好歹老子曾经也手写过基于Linux socket API的TCP通讯,怎么的加了层壳,就搞不定了?
     
    妈个叽,我去上了个厕所,冷静了一下。回来没有简单的替换socket层(那只是逃避!),而是选择,直接阅读这个基础的socket模块(LUA调用C语言的),他是如何通信的,然后找了下资料去复习了socket的Linux层面的通讯。
     
    时间不多了。长话短说。
    socket的发送和接收都是未阻塞的。socket下有个他自己写的函数叫sleep。
    每次调用request之后,他原来的代码都会sleep一下等返回。
     
    但是与之前的不一样在。现在服务端的逻辑,在login之后会返回更多的消息,sleep之后再去读取
    recv会粘包。。。具体来说是,登录之后会发2次消息:未读邮件。就是这个小问题导致了粘包。
     
    而这个简陋的socket读取并未解决这个问题。导致出错。
     16.PM ----结束
     
    小结:
    脚本小子,还是知其所以然。只在一念之间吧。。。。
     
     
    PS:本来预计二十分钟写完的。6点走的。拖到了现在七点20,写的时候还去复现了这个问题。
    其实之前还没理解那么到位,为了写这个去复现了bug后,心里已经更有把握!
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    观光公交
    审查(银)
    小木棍 && 愤怒的小鸟
    SDOI2008 仪仗队 && SDOI2012 Longge的问题 && q
    斗地主 && Mayan游戏 && 作业调度方案
    过河
    跳跳棋
    count
    Cow Tennis Tournament
    luogu P1534不高兴的津津(升级版)
  • 原文地址:https://www.cnblogs.com/facingwaller/p/6188152.html
Copyright © 2020-2023  润新知