挖井

类库大魔王的挖井日记

挖一口属于自己的井


websocket程序开发

之前提到过在公司的一个项目里用了websocket,client侧用C++开发,选了libwebsockets,使用的过程中遇到一些问题,这一个星期都是在不停地解决各个问题,好在现在终于基本上都搞定了,现在记录下来。

我们的Client是统一由C++写的底层core,运行于多种上不同的平台之上,包括Win7,x86 Gentoo,iOS,还有arm Android和Mac OSX。前三个是第一个版本必须要支持的,也各有各的问题。我最先在Win7上跑通程序,说实在的libwebsockets的文档和示例都做得不好,我也是拼拼凑凑抄抄勉强搞定。第一个提交测试的版本居然有人说有handle泄漏,而我开发过程中却没有遇到。后来意外发现有泄漏的情况都是在连不上server的时候,这就很容易重现了。用WinDBG加载运行,输入命令!htrace -enable,过一会儿有明显的泄漏了再输入命令!htrace -diff,可以看到一堆多出来的event handle,随便找一个callstack是从libwebsockets出来的,lsa callstack地址一下就跳到创建event的源代码行了。原来在创建socket时会同时创建一个event,我试着在销毁event的函数打了断点,从来不被调用。看了一下源代码,貌似在socket销毁的逻辑里有一个条件判断写反了,改了一下试试似乎不泄漏了。

Win7上跑通后,同样的代码放到Gentoo上跑,发现死活连不上,libwebsockets内部的log也没法打出来,后来build了自带的示例才看到log说创建sockets就失败了。看了Win7上运行得好好的,用netstat看都是以IPv6的地址格式创建了连接,于是我看了一下libwebsockets的CMakeLists.txt,试着关掉了IPv6的支持,发现居然真的好了!问了下公司做Gentoo镜像的同事,原来他们把IPv6禁掉了!

终于两个平台的client可以通过server通信了,还以为完事了,又可以提交测试了。结果,一票人报告说,Win7上log显示connection error!我的开发环境怎么都不能重现,正在郁闷中,想起之前在网上看到的一个issue,然后我就尝试着加了个sleep,居然真的好了!难道就是在网络性能略差,CPU运算性能略强的情况下会出现这个问题!关键是Linux下没这问题,难道就是Linux的网络性能够好?无法解释!

这次的经历真是有点坎坷,单兵开源项目的质量真是得用户自己承担很大风险啊!

本文地址:

https://minidump.info/blog/2014/12/programming-with-websocket/

上一篇

Relay Bugs

Relay在线上时不时报些bug,不但客户和公司的人怨言颇多,我也苦不堪言。每次出现问题的时候,美国的PM都会在邮件里说Relay是个very important的东西,万万不能出问题,可是我怎么没看出公司对Relay有very important的重视和投入呢!整个项目除了web前端页面,其...…

Job 全文阅读
下一篇

最近的想法

最近又在胡思乱想。首先,是我想做点能有助于记录人类文明的事。呃,这标题太大了。这工作量倒是一开始不会很大,只是会很持久,可以一直做下去。但是有些技术上的问题还没确定,有些难点需要再认真思考一下。我觉得这是件比较有意义的事,可能跟赚钱没多大关系,于是我虽然心里很想做,现实的动力又没多少了。然后,...…

idea 全文阅读