WebSocket握手总结

经过本人对WebSocket协议的研究和WebSocket服务器的编写,对WebSocket有了深入的了解,在此写个总结供以后研究参考。 本文地址:http://www.hoverlees.com/blog/?p=1413 1.概要 WebSocket是最新提出用于实现服务器与浏览器双向通信的一种解决方案,用于取代一些传统的数据推送方案(如iframe长连接,ajax轮询等)。该方案由于一直在草案阶段,最新的版本为version 13.该版本出现在RFC6455中。而在safari(包括桌面和移动版本)上则是使用的websocket的 draft-ietf-hybi版。照这个趋势看来,WebSocket早晚会向RFC6455的方向定型。 在本文中,称RFC6455版的chrome版,safari使用的版本为safari版。

自己实现的WebSocket服务器数据包处理函数

最近在写WebSocket的服务器,打算同时做基于websocket的游戏及游戏服务器。研究了一下WebSocket协议,然后基于epoll写了一个websocket的服务器,可支持超大并发量^_^,这儿向大家提供数据包解析和创建的函数,供大家学习参考。 功能参考RFC 6455 ,目前最新的websocket v13版本的协议写成。支持mask和非mask两种方式,支持解析和创建数据长度在6K以下的WebSocket数据包。 这儿只是个解析示例,现实的网络开发中应使用流解析方式生成,流方式的实现即通过向一个状态机添加缓冲区,当状态机组合出一个包头时回调。 本文地址: http://www.hoverlees.com/blog/?p=1395 websocket体验: 基于websocket的火拼俄罗斯

HTML5浏览器嵌入窗口程序解决方案

浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供脚本调用,内部的界面和逻辑处理全部用html,css,javascript去实现。我最早看到的相关应用是四五年前的新浪聊天室。我本人在后来的一些项目中也多次用到这种基于IE内核的实现方式。 随着HTML5的强大,嵌入浏览器方式比嵌入Shockwave Flash的方式更应该作为首选方案。本文介绍嵌入IE,Chrome,Firefox三种方式。 本文链接: http://www.hoverlees.com/blog/?p=1339 1.嵌入IE浏览器 嵌入IE内核应该是早期最常用的方法,使用windows平台上的ActiveX方式,将IWebBrowser2对象嵌入到窗口中,IWebBrowser2接口涉及到很多的接口,可以让我们进行事件处理、操作DOM、与JS通信,使用一个连接点接口与浏览器内部连接,获取和处理事件。 使用IE内核有一个缺点就是用户的操作系统各种各样,内核也是多个版本而且不兼容(只有IE9+才支持HTML5)。导致程序非常不稳定,再有就是不能跨平台。以至于现在嵌入IE应该是最差的方式了。 2.嵌入Firefox Mozilla的XULRunner是一个跨平台的浏览器应用框架,被Mozilla用于Firefox和ThunderBird等软件的核心,同样是开源和支持HTML5,项目使用XPCOM方式实现,除了XPCOM对象(windows系统的在xpcom.dll中)的获取外,其它属性,对象和函数的访问均与MDN上Javascript的文档相同,可谓文档齐全。同样也有已经实现的第三方C++项目将基于XULRunner的浏览器封装成控件,非常方便使用。 MDN地址:https://developer.mozilla.org/en-US/docs/XULRunner 3.嵌入Chrome Embedding Chrome:经过本人的研究,个人认为嵌入Chrome是最好的解决方案,Chrome本身开源,高效的v8引擎。同时也有很多附属的开源项目,libcef就是其中一个,cef是chrome embed framework的缩写,意在实现chrome嵌入应用程序,本人对这个项目下载下来后进行过测试,效果非常好,支持HTML5,同时跨平台。 项目地址:http://code.google.com/p/chromiumembedded/ 下面是libcef调用的示例程序,给大家做参考。

C+Lua实现的HTTP代理服务器

这是一个由C和lua实现的HTTP代理服务器,运行在linux下,服务器使用EPOLL事件模型处理网络流,性能还不错,本人已经使用它代理firefox上网一段时间了,能稳定运行。 如要应用在大并发量的场合,需要在启动程序前设置ulimit为一个合适的值,否则服务器在并发量达到限定值时直接关闭连接,出现连接重置的情况。 代理服务器实现了lua宿主,lua主要用于配置服务器的监听IP和端口,同时处理请求回调,可以通过对请求地址、请求主体内容、请求方式进行判断以决定是否接受该代理。 lua脚本文件名为config.lua,下面是一个示例配置: 从这里下载 HTTP代理服务器 源码

C实现的Sunday Search算法

Sunday Search算法(D.M. Sunday: A Very Fast Substring Search Algorithm. Communications of the ACM, 33, 8, 132-142 (1990)) 是大多数情况下比KMP和BM算法更快的串搜索算法,而且原理非常简单易理解. 例如要在”searcqpozreusevnsearch”中搜索”search” 首先初始化一个256长度的索引表,记录每个字节对应搜索串中的倒数位置,即’h’=1,’c’=2,’r’=3,’a’=4,’e’=5,’s’=6,其它字节对应-1 searcqpozreusevnsearch search 第一次循环发现’q’与’h’不等,这时候查看搜索字符串长度后一位’p’在索引表中的值,发现是-1,则直接右移搜索字符串长度+1 searcqpozreusevnsearch ——-search 第二次循环,’s’与’o’不同,再查看搜索字符串长度后一位’e’在索引表中值为5,直接右移5位 searcqpozreusevnsearch ————search 第三次循环,’v’与’a’不同,查询索引表中’a’的值为4,右移4位 searcqpozreusevnsearch —————-search 第四次循环找到匹配.正常情况下比BM和Horspool都要快很多. 以前拿汇编语言写过,由于最近又需要用到,所以又重新拿C语言写了个,这次把它发到博客上方便以后使用.

Linux 内核驱动中申请大块内存

在linux的内核模块中要申请内存,一般都是使用kmalloc的方式申请一块指定大小的内存,但这个函数有一定的限制,一般只能申请到几M到十几M的内存空间,申请内存太多将会失败。这样的限制是好的,保证具有完全权限的内核程序不会无意地过度浪费内存资源(例如通过变量a进行kmalloc(a),但因为程序员的问题,导致a是一个非常大的数字,如果不限制就会因为内存不足就导致内核崩溃了。),如果要进行DMA操作,使用几M的内存已经能达到很好的效率。 但是肯定有在内核中使用超大块内存的情况,例如vmware,它可以预分配虚拟机的所有内存。这时候,就应该自己去按页分配并自己进行页管理。 这里有一个我以前写的内核中大型内存数组管理函数,提供给大家参考参考。没有写太多的注释,仅供有兴趣的参考哈 kvector.h

windows上半透明png窗口实现示例

Windows上实现异形窗口有多种形式,比如SetWindowRgn方式,UpdateLayeredWindow方式,DirectX方式等,这儿要介绍的是最简单但最有效的UpdateLayeredWindow方式。 UpdateLayeredWindow可以将一个位图用alpha混合的方式更新到屏幕上,让Layered window具有半透明和异形的效果。 UpdateLayeredWindow函数定义如下: 其实只要这个函数调用正确,透明窗口就实现了,下面是实现的一个透明窗口示例,用的是筱筱姑娘最喜欢的阿狸作为透明窗口主角。 文章中给出类的定义说明,示例程序和源码通过这里下载

java做的大并发服务器及android客户端

本来想玩玩android的网络应用,特地买了一个htc G12手机来做实验,首先实验了p2p,发现不同的网络运营商根本打不通(为此,我还特地分析了QQ 的解决方式,他们也是走TCP的),后来想想p2p实现在这种场合根本没有太多意义,自已要实现数据包的顺序,校验,还不如用tcp.后来就做成了服务器转发方式。 可惜,我的htc被小偷偷了,准备还是用iphone 4s了,所以这个代码也不打算写了,有兴趣的人可以拿去参考参考。 服务器使用的还是java的nio方式,心得就是调用方式是和epoll最像,epoll的方式是在发送数据前注册EPOLLOUT事件,然后在有缓冲区可以发送数据时就能收到这个事件,在这个事件收到时进行数据包发送,当数据包发送完成后再取消注册EPOLLOUT事件即可,这样就不用判断是否有缓冲可以发送数据了。java nio的select 就相于epoll_wait。 相比于 windows上的io completion port方式,不同的就是数据发送。iocp发送数据是不管怎样,先把你的数据通过WSASend加到发送队列,然后内核会帮你按顺序发送这个队列,当发送完成后会通知应用程序。他们的差别在于通知是一先一后的关系,但都是最高效的。所以我猜想windows平台上的java nio实现就是只要你注册了监听写事件时就会循环收到写事件而不管缓冲区是否为空。 这是一个eclipse工程,com.hoverlees下的为android客户端程序,com.astream是拿udp做p2p的实验程序.com.astream.Server为服务器程序,Client.java为命令行客户端。 已实现的功能: 1.查看用户列表 2.选择用户进行聊天 3.可发送文本,图片,视频,语音 4.可发送离线文件。 界面比较丑,因为是做着玩的。 整个工程下载

分享C++写的可嵌入应用程序的小型HTTP服务器

由于经常需要这样一些场合,让应用程序能够响应简单的HTTP请求,以实现一些功能,所以就做了一个这样的小型HTTP服务器库。库使用C++实现,编译成MT,Release模式的静态链接库,欢迎有兴趣的朋友使用。该库仅适用Windows操作系统。 下面是库的定义: 使用示例如下:

IWebBrowser2控件快捷键,DEL,TAB等无效的解决办法

在普通情况下,IWebBrowser2控件加入到窗口中时,浏览器的快捷键,包括DEL,TAB等特殊键都不能使用。这个不是控件的Bug,而是一种特性。要让控件处理这些按键,需要通过webBrowser插件的IOleInPlaceActiveObject来处理。 具体操作是在主窗口的事件循环里处理。步骤如下: C语言使用者在QueryInterface和调用COM对象函数时,可以用我另一编关于COM的C调用的函数库。