关于基于IOCP的通讯

eryar 2014-11-12 08:48:46
加精
我们公司是做制造业软件(C/S架构)的,为了数据安全性,请外面的通讯专家(号称)帮我们做了套基于IOCP的通讯程序。由于我们这边管理上的疏忽和经验上的不足,导致正式上线后问题很多。我之前从来没接触过这方面,后来边学边试,硬着头皮改了很多bug。不过现在碰到个问题实在没法解决,所以借同事的账号在这里请教一下大家,希望能得到帮助。
说了那么多废话, 以下进入正题!
在服务端有一个主线程,一个管理者线程和n个工作者线程。主线程和工作者线程的作用和其他基于IOCP的通讯程序差不多,就不啰嗦了。管理者线程负责针对一些可能无效的资源的释放。比如用户在长时间内都没有通讯,管理者线程会关闭此用户之前建立的连接closesocket(socket)。正常情况下,此时某一个线程的GetQueuedCompletionStatus会返回一个错误值,然后线程有机会把此socket对应的内存资源释放掉。但问题来了!极少数情况下(1个月出现5次),没有任何线程会从GetQueuedCompletionStatus返回。后果是那个socket对应的内存资源会泄露了。由于泄露的内存中包含了此socket,在我们的程序中,管理者线程还会对此调用closesocket,由于释放掉的socket可能稍后被其他用户申请,因此其他客户端的连接会被关闭,导致数据混乱。
说了那么多,不知道有没有说清楚。其实简单地说就是closesocket后GetQueuedCompletionStatus有时候会不响应。我看了网上的一些文档,尝试在调用closesocket之前先调用shutdown,也不起作用。补充下,他们都正确返回了。
谢谢各位了!
...全文
5004 99 打赏 收藏 转发到动态 举报
写回复
用AI写文章
99 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2016-01-26
  • 打赏
  • 举报
回复
dfasri 2016-01-26
  • 打赏
  • 举报
回复
IOCP没研究多少, 但作为服务器来说, 架构是一样道理的: 1. 连接, 断开, 都应该由一个线程管理, 不应该哪个线程都可以立刻断开. 这样的一个基本设计就是必须要有一个阀, 当关了这个阀, 这个客户端的所有新的操作都会被拒绝, 所有当前正在进行的处理都取消 (假如可能的话, 不可能的话就让它处理完成为止). 这个管理线程是把客户端丢包待关闭列表里面, 在检测到所有的引用都去掉以后, 释放资源, 然后关闭. 这样来确保客户端的数据不会混乱. 即便是碰上上述的io没返回出队也好, 因为旧有的客户端已经没有东西存在了, 自然同样的socket也好, 不出队也照样收数据, 没任何问题. 这点来说, iocp是没做错的, 在快速的断开和连接上, socket在出队超时的时候被重用了, 反正也是要重新入队的, 也就算了吧.(可能^_^) 2. 工作线程, 说白一句, 会写多线程的人, 在一家公司里面简直就是少之又少, 也不是可靠的多. 单工作线程+多运行实例是比较合理的做法. 3. 所谓的线程池, 线程池是成熟的技术, 但不是什么好做法, 用不好很容易出现各种问题, 尽量保持一个请求就是一个工作线程解决全部比较好, 别为请求加流水线了.
  • 打赏
  • 举报
回复
qq_33488850 2015-12-24
  • 打赏
  • 举报
回复
不断提高自己2222
qq_33488850 2015-12-24
  • 打赏
  • 举报
回复
不断提高自己
足球中国 2015-12-24
  • 打赏
  • 举报
回复
在服务器中用线程池本身就有问题。 由于线程的问题从而导致数据的错乱。这肯定是你们写的方法就有问题。 任何程序都或API都可能会有BUG。而是你怎么样绕过这个BUG。去实现自己的目标。 在服务器出现高并发,或者网络出现堵塞的情况下测试可能问题会更多。
足球中国 2015-12-24
  • 打赏
  • 举报
回复
在服务器中用线程池本身就有问题。 由于线程的问题从而导致数据的错乱。这肯定是你们写的方法就有问题。 任何程序都或API都可能会有BUG。而是你怎么样绕过这个BUG。去实现自己的目标。 在服务器出现高并发,或者网络出现堵塞的情况下测试可能问题会更多。
足球中国 2015-12-24
  • 打赏
  • 举报
回复
在服务器中用线程池本身就有问题。 由于线程的问题从而导致数据的错乱。这肯定是你们写的方法就有问题。 任何程序都或API都可能会有BUG。而是你怎么样绕过这个BUG。去实现自己的目标。 在服务器出现高并发,或者网络出现堵塞的情况下测试可能问题会更多。
业余草 2015-12-24
  • 打赏
  • 举报
回复
帮你顶一下,顺便学习一下
qq_33491429 2015-12-24
  • 打赏
  • 举报
回复
「已注销」 2015-12-24
  • 打赏
  • 举报
回复
不懂,很厉害
qq_27244923 2015-12-24
  • 打赏
  • 举报
回复
强,哥们太牛了
cattpon 2015-12-24
  • 打赏
  • 举报
回复
源代码都出来了~
nettman 2015-12-23
  • 打赏
  • 举报
回复
fzcxg 2015-12-23
  • 打赏
  • 举报
回复
服务器程序需要很详细的log日志的,跟踪出问题的socket慢慢找. 关闭应该会触发的,有没有可能你在关闭的时候你的操作已经被你取出来不在完成端口里面了
fzcxg 2015-12-23
  • 打赏
  • 举报
回复
服务器程序需要很详细的log日志的,跟踪出问题的socket慢慢找. 关闭应该会触发的,有没有可能你在关闭的时候你的操作已经被你取出来不在完成端口里面了
fzcxg 2015-12-23
  • 打赏
  • 举报
回复
服务器程序需要很详细的log日志的,跟踪出问题的socket慢慢找. 关闭应该会触发的,有没有可能你在关闭的时候你的操作已经被你取出来不在完成端口里面了
qq_30679533 2015-12-23
  • 打赏
  • 举报
回复
那个书错误的嘻嘻
saisi123 2015-12-23
  • 打赏
  • 举报
回复
独孤志洋 2015-12-23
  • 打赏
  • 举报
回复
加载更多回复(62)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧