不知道是什么具体的原因,望知情者告知

lianglp 2005-08-09 01:40:55
网络采用Iocp模型,每个新创建的socket关联到完成端口(每个socket在创建的时候也申请相应的内存作为上下文信息),并在工作线程中等待网络事件的发生。如果用户想主动关闭socket,则在关闭后也释放相应为保存上下文信息的内存空间。在关闭socket时,简单代码:
closesocket(sk);
::Sleep(10);//如果拿掉这句,有可能会有问题
delete pSocketContext;
问题就出在这,如果关闭socket后,没有Sleep(),马上释放内存,有可能系统会在关闭之后写已释放的内存。因为在pSocketContext中,其中有一个为OVERLAPPED的结构,是在WSARecv(...)时的投递所用的指针。

现在不解的是:有些时候,在closesocket()后,如没有加入Sleep()马上释放内存,系统还是会写上下文所在的OVERLAPPED结构的内存。这样就导致写入的内存空间为非法了。本人通过调试,发现了这种问题,在释放内存时,就可能会现出"User breakpoint called from 0x?????"

有什么方法可以解决???那位遇到过这种问题。
...全文
87 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2005-08-09
  • 打赏
  • 举报
回复
closesocket后需要等到正在Send/Recv的Overlap操作完成或取消。
你可以看看PlatformSDK中的iocpserver示例。
windcsn 2005-08-09
  • 打赏
  • 举报
回复
closesocket有可能是但方面的关闭,不能一定保证网络没有数据流动了,只有双方都关闭了才会彻底没有数据流动
lianglp 2005-08-09
  • 打赏
  • 举报
回复
晕!!!
各位,我是在问具体closesocket后,为什么还会对overlapped结构进行内存操作的问题!!!
回答这个问题好吗?
DentistryDoctor 2005-08-09
  • 打赏
  • 举报
回复
closesocket(m_hSocket);
while(!HasOverlappedIoCompleted((LPOVERLAPPED)pIOContextRead))Sleep(0);
while(!HasOverlappedIoCompleted((LPOVERLAPPED)pIOContextWrite))Sleep(0);
delete
lianglp 2005-08-09
  • 打赏
  • 举报
回复
to 回复人: windcsn(向所有的朋友学习!)
线程是不会去释放的,也就是说线程不会结束的,因为其它socket还要服务。
windcsn 2005-08-09
  • 打赏
  • 举报
回复
你需要等待线程结束的时候再释放资源,使用waitforsingleobject可能比sleep效果要好,因为这个函数等待THREAD的HANDLE,等待线程执行完毕之后返回,这样可能不需要指定的时候,可能指定的时间不够,保证你释放资源的时候,没有THREAD再写了
lianglp 2005-08-09
  • 打赏
  • 举报
回复
我是在找具体原因,为什么关闭了后(调用closesocket),这之后还对OVERLAPPED地址空间进行操作?应该不会出现这个问题才对啊!
dirdirdir3 2005-08-09
  • 打赏
  • 举报
回复
如果怕影响效率可以考虑生成个线程来处理。
dirdirdir3 2005-08-09
  • 打赏
  • 举报
回复
使用Sleep(10);有什么不妥?closesocket(sk);需要时间关闭。
teli_eurydice 2005-08-09
  • 打赏
  • 举报
回复
不知道,帮你UP

18,356

社区成员

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

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