关于LPC,我要说的一些值得注意的地方。。。

这几天研究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切换片)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值