请教IOCP中DisconnectEx的使用?

feilongjilei 2010-10-07 10:11:37
请教牛人:
1.服务器向完成端口投递DisconnectEx,关闭一个客户端连接,当操作完成时,就可以重用先前与客户端连接的socket了。
2.客户端关闭与服务器连接的套接字,服务器上与该客户端相关的重叠操作都以失败返回,这时我们想要重新利用先前与客户端连接的socket,是直接就可以用了,还是需要在这个socket上投递一个DisconnectEx并在它的完成通知中重用呢?
3.客户端非正常关闭(比如,直接拔掉网线),服务器上与该客户端相关的重叠操作是否直接以失败返回?这时我们要重用先前与客户端连接的套接字,还需要先向完成端口投递一个DisconnectEx并在它的完成通知中重用呢?

大家知道的,尽量给出原因,指出在哪找到资料的也行,先谢谢了!

...全文
551 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hslinux 2010-10-12
  • 打赏
  • 举报
回复

mark
feilongjilei 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 superdiablo 的回复:]
引用 2 楼 feilongjilei 的回复:
引用 1 楼 superdiablo 的回复:
2. 需要在这个socket上投递一个DisconnectEx并在它的完成通知中重用.
3. 如果设置了KeepAlive,服务器上与该客户端相关的重叠操作会直接以失败返回。我们仍然需要先向完成端口投递一个DisconnectEx并在它的完成通知中重用。

DisconnectEx重叠操作要……
[/Quote]
1种情况下,服务器自己主动投递DisconnectEx,服务器上关于这个连接的其它重叠操作(比如:接收操作)不是都要以失败返回吗?返回的错误代码时多少呢?
我现在迷惑的是什么时候投递DisconnectEx?
superdiablo 2010-10-09
  • 打赏
  • 举报
回复
如果是主动投递导致其它重叠操作失败,其它重叠操作失败后你不应该再调用DisconnetEx。具体如何判断是哪种失败,判断GetLastError的返回值情况太多了,建议做法是把自己是否已经主动DisconnetEx记录下来,如果已经投递了DisconnetEx就不再投递。
feilongjilei 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 superdiablo 的回复:]
可以主动投递DisconnectEx,此时关于这个连接的其它重叠操作都以失败返回。也可以在某个操作失败后再投递DisconnectEx,此时除了那个失败的操作外其他操作也失败返回。在两种情况下你都可以在DisconnectEx本身的返回中重用socket。你可以把DisconnectEx看成是清理Socket使得它可以重用的一种方式。
[/Quote]
主动投递导致其它重叠操作失败,其它重叠操作失败又导致投递DisconnetEx....

我想要根据其它重叠失败的返回值来确定是DisconnectEx导致的重叠操作失败?还是网络原因导致的重叠操作失败?

请问谁有GetQueuedCompltionStatus所有情况下失败的返回值吗?
superdiablo 2010-10-09
  • 打赏
  • 举报
回复
可以主动投递DisconnectEx,此时关于这个连接的其它重叠操作都以失败返回。也可以在某个操作失败后再投递DisconnectEx,此时除了那个失败的操作外其他操作也失败返回。在两种情况下你都可以在DisconnectEx本身的返回中重用socket。你可以把DisconnectEx看成是清理Socket使得它可以重用的一种方式。
superdiablo 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feilongjilei 的回复:]
引用 1 楼 superdiablo 的回复:
2. 需要在这个socket上投递一个DisconnectEx并在它的完成通知中重用.
3. 如果设置了KeepAlive,服务器上与该客户端相关的重叠操作会直接以失败返回。我们仍然需要先向完成端口投递一个DisconnectEx并在它的完成通知中重用。

DisconnectEx重叠操作要等到所有与该客户端有关的其它重叠操作都完成后才完成吧……
[/Quote]
理论上应该是这样的,否则重用一个在重叠操作中的socket应该会有问题。不过这个不能确定,你可以试试看会不会有违反这种假设的情况。
xgPaul 2010-10-08
  • 打赏
  • 举报
回复
我会考虑如果客户端与服务器连接断开了,在此套接字上投递的重叠操作都会失败,就要释放投递的缓冲区,关闭套接字,不用重用此socket,直接要客户端重连。。。
feilongjilei 2010-10-08
  • 打赏
  • 举报
回复
帖子沉得真快呀,悲剧?
feilongjilei 2010-10-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superdiablo 的回复:]
2. 需要在这个socket上投递一个DisconnectEx并在它的完成通知中重用.
3. 如果设置了KeepAlive,服务器上与该客户端相关的重叠操作会直接以失败返回。我们仍然需要先向完成端口投递一个DisconnectEx并在它的完成通知中重用。
[/Quote]
DisconnectEx重叠操作要等到所有与该客户端有关的其它重叠操作都完成后才完成吧?
superdiablo 2010-10-07
  • 打赏
  • 举报
回复
2. 需要在这个socket上投递一个DisconnectEx并在它的完成通知中重用.
3. 如果设置了KeepAlive,服务器上与该客户端相关的重叠操作会直接以失败返回。我们仍然需要先向完成端口投递一个DisconnectEx并在它的完成通知中重用。

18,356

社区成员

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

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