背景交代。最近在玩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后,心里已经更有把握!
 
 
 
 
 
 
 
 
 
 
 
 
 
 

调试一个socket通信bug的心理过程和反思的更多相关文章

  1. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  2. Android之从TCP/IP、HTTP看Socket通信

    1.概念 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传 ...

  3. TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统

    TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...

  4. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  5. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  6. .net平台下C#socket通信(中)

    上篇.net平台下C#socket通信(上)介绍了socket通信的基本原理及最基本的通信方式.本文在此基础上就socket通信时经常遇到的问题做一个简单总结,都是项目中的一些小问题,拿来此处便于下次 ...

  7. [转]Flash Socket通信的安全策略

    昨天做测试的时候遇到一个问题,做好的SWF在Flash AS3中调试通过,但是发布到html中之后就无法得到数据了.查了一些资料之后找到了解决办法.这里感谢 剑心 提供帮助,以及同事若水三千提供Jav ...

  8. .net平台下C#socket通信(转)

    上篇.net平台下C#socket通信(上)介绍了socket通信的基本原理及最基本的通信方式.本文在此基础上就socket通信时经常遇到的问题做一个简单总结,都是项目中的一些小问题,拿来此处便于下次 ...

  9. Android模拟器的ip获取以及模拟器之间socket通信

    Android模拟器的ip获取以及模拟器之间socket通信           http://kalogen.iteye.com/blog/1565507 作者:李波 实现网络五子棋时用到了两个设备 ...

随机推荐

  1. 关于SQLSERVER中用SQL语句查询的一些个人理解

    作为一个编程菜鸟说真的很难有什么见解,也就是写给一些刚学习编程的人,希望能给他们一些帮助吧! SQLSERVER作为刚开始入门学习的数据库,SQL语句也并不算太难!说白了也就是建库,建表,建约束,对数 ...

  2. XE2 泛型练习1

    要引用单元 System.Generics.Collections implementation {$R *.dfm}var i: Integer; str: string; procedure TF ...

  3. hasLayout && Block Formatting Contexts

    转自:http://www.smallni.com/haslayout-block-formatting-contexts/ 因为本人脑子不好使,自己打印出了一张hasLayout和Block For ...

  4. Leetcode First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  5. Spark RDD 多文件输入

    1.将多个文本文件读入一个RDD中 SparkConf conf=new SparkConf() .setMaster("local") .setAppName("sav ...

  6. compass General 常用api学习[Sass和compass学习笔记]

    compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 ...

  7. 有限状态机(FSM)

    在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...

  8. 一些简单编程练习题P【持续更新】

    Q1.写程序将“Hello World”打印到屏幕. A1. public class Test { public static void main(String[] args) { System.o ...

  9. Java的算数运算符、关系运算符、逻辑运算符、位运算符

    JAVA的运算符,分为四类: 算数运算符.关系运算符.逻辑运算符.位运算符 算数运算符(9):+  -  *  /  %  ++  -- 关系运算符(6):==  !=  >  >=  & ...

  10. Ubuntu 14.04 安装pdf阅读器

    1. 个人推荐 okular. 关于安装okular的原因,可以很好的做到护眼功能. Ubuntu 14.04 自带的阅读器,因为白色太刺眼,长时间使用对眼睛不好. 对于,长时间编程的朋友们习惯夜间模 ...