背景交代。最近在玩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. Linux安装搜狗拼音输入法

    环境:Ubuntu1604 英文版 1.下载搜狗安装包 2.双击deb文件进行安装 3.在终端执行如下命令 im-config 弹出对话框,点击OK,然后又弹出一个对话框,点击YES.如果弹出的对话框 ...

  2. PV 与 并发数 之间的故事

    PV: Page View UV: Unique Visitor 在一些已经上线的项目中,运营会统计每日的PV,UV,IP 等数据 而根据PV量,可以推算出一个相对较科学的并发数,来作为负载测试的一个 ...

  3. Java上传截断漏洞的解决方案

    文件上传漏洞解决方案 1. 最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限:实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存 ...

  4. [Python学习] python 科学计算库NumPy—矩阵运算

    NumPy库的核心是矩阵及其运算. 使用array()函数可以将python的array_like数据转变成数组形式,使用matrix()函数转变成矩阵形式. 基于习惯,在实际使用中较常用array而 ...

  5. 如何打开VPK文件?里面究竟有什么?

    在DOTA2游戏目录下有一类VPK文件,如何打开VPK文件? 下载http://nemesis.thewavelength.net/index.php?p=26,安装完成后即可打开. 打开dota 2 ...

  6. JSHint Options 翻译

    Enforcing options When set to true, these options will make JSHint produce more warnings about your ...

  7. C# XMPP客户端与openfire通信(Matrix Xmpp 授权破解教程)

    如此著名的XMPP , 居然试过jabber-net, agsXmpp,matrix Xmpp, 无数多个例子, 居然没有一个能实现最简单的 发消息.收消息功能.好无语. 最后还是决定从商业产品 Ma ...

  8. 启动 apache2.4 出现 invalid command order 问题 【由于 PHP 访问权限 403 问题引起】

    由于网站出现  403 禁止访问,所以修改了 httpd.conf 文件的权限如下 <Directory /> Options FollowSymLinks AllowOverride N ...

  9. Web.xml各版本模版

    web.xml v2.3 web.xml v2.4 <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  10. java并发编程(八)多线程环境下安全使用集合

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509     在集合API中,最初设计的Vector和Hashtable是多线程安 ...