closesocket关闭的问题

猫儿累了 2014-04-02 02:18:26
我想把完成端口里投递的IO(如WSARecv)请求全部取消掉,也就是让他们从GetQueuedCompletionStatus中返回。
所以我就直接用closesocket,然后套接字关闭并释放资源。问题就来了。
A线程closesocket释放套接字后(假设该套接字值为222),关闭之后我再在这个套接字的任何操作都是失败返回的了。那么假如正好其他线程刚好在我关闭222这个套接字后马上调用socket函数创建到222这个值的新套接字,那么我A线程肯定出错了。
想问的是,closesocket释放套接字后,该套接字的值会不会马上因为空闲了而被新的套接字用上。
有没有办法让我继续占有这个套接字的句柄(222),但是我又能关闭它的连接并使投递到完成端口的IO操作全部返回?


...全文
789 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ancyscat 2016-01-08
  • 打赏
  • 举报
回复
MARK :closesocket关闭的问题 谢谢
赵4老师 2014-04-08
  • 打赏
  • 举报
回复
适当时需要加锁和WaitSingleObject
猫儿累了 2014-04-08
  • 打赏
  • 举报
回复
引用 12 楼 yaozhiyong110 的回复:
你可以先shutdown 那么GetQueuedCompletionStatus对于这个socket的投递就会返回失败了 等这个socket的所有投递都返回后你再closesocket PS:你的描述有问题 scoket句柄和端口是不一样的 你就算后面建了个socket绑定222也和前面那个socket不是同一个socket GetQueuedCompletionStatus也不会有什么问题...
shutdown(222,2)直接失败····难道绑定完成端口的套接字不能用 shutdown?
yaozhiyong110 2014-04-03
  • 打赏
  • 举报
回复
就好比socket是身份证号 端口是名字(假设不能重名,事实上也是可以重名的,socket也是支持端口重用的) GetQueuedCompletionStatus那里的关联值应该是socket句柄(身份证号)而不是端口(名字), 所以就算你close后马上create 对于GetQueuedCompletionStatus来说是不用的两个人即使后一个人用前一个人的名字...
yaozhiyong110 2014-04-03
  • 打赏
  • 举报
回复
你可以先shutdown 那么GetQueuedCompletionStatus对于这个socket的投递就会返回失败了 等这个socket的所有投递都返回后你再closesocket PS:你的描述有问题 scoket句柄和端口是不一样的 你就算后面建了个socket绑定222也和前面那个socket不是同一个socket GetQueuedCompletionStatus也不会有什么问题...
worldy 2014-04-02
  • 打赏
  • 举报
回复
引用 8 楼 qq1026605798 的回复:
[quote=引用 6 楼 worldy 的回复:] [quote=引用 3 楼 qq1026605798 的回复:] 我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
即使这样,那又会有什么问题?在closesocket(222)的时候,所有222相关的未完成将返回,你再创建的222和原来的222没有任何关系[/quote] 你看看以下步骤: 完成端口工作者A返回IO......为222(原)套接字的重叠操作 主线程关闭套接字222(原) 主线程创建新的套接字,刚好为222(新),并绑定完成端口,但不投递任何操作 完成端口工作者A返回IO......为222(原)套接字的重叠操作,然后刚好运行到WSARECV(222,.........) 那么不就出错了?我主线程刚创建的套接字根本没投递什么····但是却.......投递了东西[/quote] 怎么可能,close后,GetQueuedCompletionStatus返回的是false,根本不是走正常的路径
Eleven 2014-04-02
  • 打赏
  • 举报
回复
引用 8 楼 qq1026605798 的回复:
[quote=引用 6 楼 worldy 的回复:] [quote=引用 3 楼 qq1026605798 的回复:] 我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
即使这样,那又会有什么问题?在closesocket(222)的时候,所有222相关的未完成将返回,你再创建的222和原来的222没有任何关系[/quote] 你看看以下步骤: 完成端口工作者A返回IO......为222(原)套接字的重叠操作 主线程关闭套接字222(原) 主线程创建新的套接字,刚好为222(新),并绑定完成端口,但不投递任何操作 完成端口工作者A返回IO......为222(原)套接字的重叠操作,然后刚好运行到WSARECV(222,.........) 那么不就出错了?我主线程刚创建的套接字根本没投递什么····但是却.......投递了东西[/quote] 不会的吧
Eleven 2014-04-02
  • 打赏
  • 举报
回复
你可用PostQueuedCompletionStatus,让你的IOCP的等待线程返回,不一定非得用closesocket()
猫儿累了 2014-04-02
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
[quote=引用 3 楼 qq1026605798 的回复:] 我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
即使这样,那又会有什么问题?在closesocket(222)的时候,所有222相关的未完成将返回,你再创建的222和原来的222没有任何关系[/quote] 你看看以下步骤: 完成端口工作者A返回IO......为222(原)套接字的重叠操作 主线程关闭套接字222(原) 主线程创建新的套接字,刚好为222(新),并绑定完成端口,但不投递任何操作 完成端口工作者A返回IO......为222(原)套接字的重叠操作,然后刚好运行到WSARECV(222,.........) 那么不就出错了?我主线程刚创建的套接字根本没投递什么····但是却.......投递了东西
cchvsgame 2014-04-02
  • 打赏
  • 举报
回复
完成端口的键值,不一定非要和socket包柄 绑定啊
worldy 2014-04-02
  • 打赏
  • 举报
回复
引用 3 楼 qq1026605798 的回复:
我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
即使这样,那又会有什么问题?在closesocket(222)的时候,所有222相关的未完成将返回,你再创建的222和原来的222没有任何关系
猫儿累了 2014-04-02
  • 打赏
  • 举报
回复
引用 4 楼 xian_wwq 的回复:
[quote=引用 3 楼 qq1026605798 的回复:] 我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
会不会实验方法有问题? 不论是用accept还是用acceptex进行投递,没有碰到过这一类问题。。。[/quote] 有没有办法使这个套接字不释放,但是它的IO都返回?
xian_wwq 2014-04-02
  • 打赏
  • 举报
回复
引用 3 楼 qq1026605798 的回复:
我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
会不会实验方法有问题? 不论是用accept还是用acceptex进行投递,没有碰到过这一类问题。。。
猫儿累了 2014-04-02
  • 打赏
  • 举报
回复
我的实验中证实了我的想法····假如线程A closesocket(222),那么线程B马上创建的话,就能创建到这个222的套接字,VC2010调试····救命啊~~~
猫儿累了 2014-04-02
  • 打赏
  • 举报
回复
万一碰上岂不是崩溃........
oyljerry 2014-04-02
  • 打赏
  • 举报
回复
系统维护,应该不会这么容易碰上

18,356

社区成员

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

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