网络采用Iocp模型,每个新创建的socket关联到完成端口,并在工作线程中等待网络事件的发生。如果用户想主动关闭socket,则在关闭后也释放相应为保存上下文信息的内存空间。在关闭socket时,简单代码:
closesocket(sk);
::Sleep(10);//如果拿掉这句,有可能会有问题
delete pSocketContext;
问题就出在这,如果关闭socket后,没有Sleep(),马上释放内存,有可能系统会在关闭之后写已释放的内存。因为在pSocketContext中,其中有一个为OVERLAPPED的结构,是在WSARecv(...)时的投递所用的指针。
现在不解的是:有些时候,在closesocket()后,如没有加入Sleep()马上释放内存,系统还是会写上下文所在的OVERLAPPED结构的内存。这样就导致写入的内存空间为非法了。本人通过调试,发现了这种问题,在释放内存时,就可能会现出"User breakpoint called from 0x?????"
有什么方法可以解决???那位遇到过这种问题。
不知道,帮你UP
如果怕影响效率可以考虑生成个线程来处理。
你需要等待线程结束的时候再释放资源,使用waitforsingleobject可能比sleep效果要好,因为这个函数等待THREAD的HANDLE,等待线程执行完毕之后返回,这样可能不需要指定的时候,可能指定的时间不够,保证你释放资源的时候,没有THREAD再写了
closesocket(m_hSocket);
while(!HasOverlappedIoCompleted((LPOVERLAPPED)pIOContextRead))Sleep(0);
while(!HasOverlappedIoCompleted((LPOVERLAPPED)pIOContextWrite))Sleep(0);
delete
closesocket有可能是但方面的关闭,不能一定保证网络没有数据流动了,只有双方都关闭了才会彻底没有数据流动