这几天研究LPC,因为技术资料比较少,网上也只能找到仅有的一点例子,而且很多代码都不完整,我也没办法就蒙着脑袋做了,然后做下来,发现个SB到透顶的问题:
NtCreatePort(NtCreateWaitablePort)创建的一个LPC的Port只能【对应一个Client】也就是一个Server Port不可能响应N个Client的请求,我设计的思路是NtCreatePort创建一个LPC端口,然后开辟一个线程(服务监听线程),使用NtListenPort等待客户端NtConnectPort发来的消息,然后NtAcceptConnectPort握手连接,再开一个线程去NtReplyWaitReceivePort上述NtAcceptConnectPort返回的hPort(客户处理线程)。
这个思路很好很天真,可实际执行起来就傻逼了,客户处理线程中的NtReplyWaitReceivePort监听的NtAcceptConnectPort返回的hPort经常漏消息,比如有时候漏NtRequestPort啊、有时候漏NtRequestWaitReplyPort之类的,百思不得其解,我把NtCreatePort换成NtCreateWaitablePort也还是一样,蛋疼无比。。。
然后仔细观察,这些消息漏去哪里了呢?嘿,没错,漏去服务监听线程的NtListenPort了,而NtListenPort又忽略了除建立连接以外的消息,服务端处理线程挂起卡死了。。。
然后我得出的结论是:
NtCreatePort虽然“名义”上有一个参数指定可接收的最大连接总数,如果那个参数为0,就是可以接受无限个连接,可实际上NtCreatePort建立的LPC端口,一个端口对应一个Client,当某个Client通过NtConnectPort跟我们的Server建立通讯后,这个Server的Port就被占用了。
NtAcceptConnectPort返回的端口是Client用的,对Server无用处,Server就只能用NtCreatePort的原始端口来监听,如果2个同时上,会导致漏消息,漏什么消息看RP(2个线程的CPU切换片)。
相关文章
- 一些关于Castle + Nhibernate+ ASP.NET的资源,我收集了一下,发布出来,供大家学习方便。
- Ruby元编程的一些值得注意的地方
- 一些关于我的精准描述表情包 我是废物表情包
- 在PostgreSQL中使用数组时值得注意的一些地方
- Nginx服务器中配置404错误页面时一些值得注意的地方
- 关于C#编程中引用与值类型赋值的一些容易犯错的地方
- 关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理
- 关于B/S系统在移动端应用的一些注意的地方(不断更新)
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
- SQL指令中一些特别值得注意的地方