背景交代。最近在玩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. android控件 ToggleButton的应用

    ToggleButton是android给我们提供的开关按钮, 有两种状态:选中和未选择状态. 以下是代码实例: main.xml [html] view plain copy <?xml ve ...

  2. linux学习笔记-前篇

    大学毕业已经快三年了,从事嵌入式开发的工作也快三年了. 不过,老干些裸机开发,感觉很是枯燥,一咬牙一跺脚,决定从今天开始学习Linux操作系统,顺便记录下学习过程中所遇到的问题与心得. 自己从前完全没 ...

  3. 2015年ACM长春网络赛(准备做掉7道:已经更新到6道)

    总结汇总:模板 int getmax_min(char s[]) {//字符串的最大表示法:返回最小数组下标 , j = , k = ; while(i < len && j & ...

  4. C#连接Access数据库(详解)

    做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以 ...

  5. 未能加载文件或程序集“System.Data.SQLite”或它的一个依赖。试图加载格式不正确的程序

    Go to the IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

  6. 几种经典排序算法的R语言描述

    1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...

  7. BZOJ2471 : Count

    考虑KMP,设$f[i][j][S]$表示还剩最低$i$位没有确定,目前KMP匹配到了$j$这个位置,前缀匹配情况是$S$,最终会匹配到哪里,中途匹配成功几次. 其中$S[i]$是一个pair< ...

  8. 【MongoDB:第二天】基本操作

    接上一篇博客: http://www.cnblogs.com/xiaoit/p/3867573.html 1:插入新的数据 db.person.insert({"uid" : 12 ...

  9. JavaScript之闭包就是个子公司

    在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有 ...

  10. myeclipse项目上出现红色叹号

    右键选中项目:build path→configure build path (由于的我是在问题解决之后发表的博客,所以jar包上面的红色叉子不见了,只要选中红色的jar包,然后选择‘Remove’按 ...