背景交代。最近在玩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. BestCoder Round #86

    A题 Price List 巨水..........水的不敢相信. #include <cstdio> typedef long long LL; int main() { int T; ...

  2. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  3. 酷炫放大镜canvas实现

    主要采用了canvas内渲染canvas的技术,还有利用比例来放大图片 比例:放大镜宽度/画布宽度=原图宽度/渲染图宽度 <!DOCTYPE html><html lang=&quo ...

  4. Java知识结构

  5. 【新手学Python】一、基础篇

    由于以前处理数据用Matlab和C,最近要处理大量文本文件,用C写实在是太繁琐,鉴于Python的强大文本处理能力,以及其在Deep Learning上有着很大优势,本人打算从即日起学习Python, ...

  6. volatile与synchronized的区别

    1.锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility). 互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一 ...

  7. 通过hexo+NexT构建静态博客

    一般的教程网上有很多,主要讲下我遇到的问题以及解决方法: 一.hexo建立的文档无法上传github deploy: type: git repository: https://github.com/ ...

  8. jquery mobile页面跳转缓存问题解决

    最近,我的一个写后端的同事因为缺前端自己做起了前端的活儿,因为对前端的不熟悉,找寻了一些现成框架想轻松了事,做一个web app他选了jquery mobile,开发效率确实高,但是这个框架的一些坑也 ...

  9. [转]Oracle数据块体系的详细介绍

    数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...

  10. Java 事件机制

    java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...