我已经被搞了一个星期了。事情是这样的:
我要向外部发起很多个连接(500+),所以打算用完成端口来搞定。我用ConnectEx发起连接,然后关联到完成端口,并在GQCS等待完成。现在的问题是,在GQCS未返回前,我如何能取消掉该操作。这个是有必要的,比如说用户取消该连接或者超时处理。
首先我试了closesocket,发现,如果在发起ConnectEx的线程里closesocket,GQCS有时候会返回,有时候不返回,特别是当发出的ConnectEx数量比较多的时候。(也不是太多,比如100个,可能有那么5,60个可以返回,别的不返回),不返回的SOCKET将会等20s之后返回121错误,就好像从来没有发出过closesocket一样。如果加上shutdown(s,SD_BOTH),情况稍微好一点,但仍然不能保证全部返回。
如果不在发起ConnectEx的线程里closesocket,基本没有反应。
如果PostQueuedCompletionStatus发一个特殊构造的包过去,如此从GQCS返回。但问题是,当20s时间到后,GQCS会再返回该请求,错误码121。也就是说Post让GQCS返回之后,还是面临怎么取消的问题。
最后我这样用:
shutdown(s,SD_BOTH);
closesocket(s);
CancelIO((HANDLE)s);//对ConnectEx,只要CancelIo就行了,但对WSARecv,需要加前面两句,不然GQCS确实返回了,但连接实际上还在。
看起来好像工作了。但是这个看起来也怎么都不舒服。在网上搜出来的文档基本上都是说,要取消一个pending的操作,只要closesocket就可以从GQCS 上返回了,我怎么就是不行呢?
在别的地方也发了贴子,里面有测试代码,不过没人理,现在CSDN怎么了?解决了一起给分(分不是问题)
http://topic.csdn.net/u/20091020/10/a6d26014-489e-4af1-a634-a2e3cb0949a0.htmlhttp://topic.csdn.net/u/20091019/16/524e5415-1712-4000-8157-5210fc88bcb3.html