如何判断ConnectEx的超时?

oldmtn 2014-09-23 02:51:13
有一个客户端,想用完成端口去连接多个服务器,

具体使用ConnectEx连接100个服务端,设定超时为10秒。

10秒后:1. 使用closesocket关闭这100个套接字;2.DisconnectEx这100个套接字。

但是GetQueuedCompletionStatus并没有返回100次,大概仅返回了60~70次。为什么这样?


...全文
374 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnorth 2016-12-11
  • 打赏
  • 举报
回复
今天正好也碰到了相同的问题,我测试了下,完成端口操作字节数在ConnectEx不传递首次数据时是为0了的,所以就不太容易判断这个东西,但是在主动closesocket时, GetQueuedCompletionStatus 返回了0,但是此时 lpOverlapped 是有效的。 所以,我的做法是,自己判断超时,从调用ConnectEx那一刻开始,如果超时了,直接closesocket,然后GetQueuedCompletionStatus 返回0并且lpOverlapped 是有效的时候,清理资源。
xian_wwq 2014-09-25
  • 打赏
  • 举报
回复
引用 3 楼 oldmtn 的回复:
[quote=引用 2 楼 xian_wwq 的回复:] [quote=引用 楼主 oldmtn 的回复:] 有一个客户端,想用完成端口去连接多个服务器, 具体使用ConnectEx连接100个服务端,设定超时为10秒。 10秒后:1. 使用closesocket关闭这100个套接字;2.DisconnectEx这100个套接字。 但是GetQueuedCompletionStatus并没有返回100次,大概仅返回了60~70次。为什么这样?
按道理一旦socket关闭,则这个socket上进行的所有投递都会返回 但是返回并不一定是实时的 比如DisconnectEx投递可能会在30s或者更长时间(持续2MSL时间长度)以后才返回 [/quote] 你有做过实验吗? 按你这样说,那我自己就没办法终止ConnectEx了? [/quote] 实测结果,本来在server端不想关闭socket,调用DisconnectEx复用socket,构建socket池, 因为这种情况,只要直接close
oldmtn 2014-09-24
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
[quote=引用 楼主 oldmtn 的回复:] 有一个客户端,想用完成端口去连接多个服务器, 具体使用ConnectEx连接100个服务端,设定超时为10秒。 10秒后:1. 使用closesocket关闭这100个套接字;2.DisconnectEx这100个套接字。 但是GetQueuedCompletionStatus并没有返回100次,大概仅返回了60~70次。为什么这样?
按道理一旦socket关闭,则这个socket上进行的所有投递都会返回 但是返回并不一定是实时的 比如DisconnectEx投递可能会在30s或者更长时间(持续2MSL时间长度)以后才返回 [/quote] 你有做过实验吗? 按你这样说,那我自己就没办法终止ConnectEx了?
xian_wwq 2014-09-24
  • 打赏
  • 举报
回复
引用 楼主 oldmtn 的回复:
有一个客户端,想用完成端口去连接多个服务器, 具体使用ConnectEx连接100个服务端,设定超时为10秒。 10秒后:1. 使用closesocket关闭这100个套接字;2.DisconnectEx这100个套接字。 但是GetQueuedCompletionStatus并没有返回100次,大概仅返回了60~70次。为什么这样?
按道理一旦socket关闭,则这个socket上进行的所有投递都会返回 但是返回并不一定是实时的 比如DisconnectEx投递可能会在30s或者更长时间(持续2MSL时间长度)以后才返回
  • 打赏
  • 举报
回复
投递ConnectEx 100次会至少返回100次,因为还设置了超时,所以还可能因为超时而返回

18,356

社区成员

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

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