关于基于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,也不起作用。补充下,他们都正确返回了。
谢谢各位了!