使用AcceptEx来监听,同时在一个连接断开后,调用DisconnectEx以重用socket,
但是在重用时,调用CreateIoCompletionPort,返回错误代码87,提示说参数错误?在一个套接字附加到完成端口后,调用DisconnectEx不会从完成端口撤销吗?那又怎么从一个完成端口撤销一个句柄呢?
或者说,应该以什么样的思路来实现?=
运行系统为 winxp sp3,已尝试 SO_UPDATE_ACCEPT_CONTEXT,但是仍然第二次 CreateIoCompletionPort 还是返回错误代码 87,这难道是一个正常情况?虽然程序运行是没有问题,但觉得这样好像不太合理。

解决方案 »

  1.   

    从完成端口撤销1个socket 只要closesocket就行,其它的事不用管DisconnectEx//相当于closesocket(....)+socket(...)AcceptEx使用之前要创建1个socket并传进去//socket sock = socket(...);
    也可以用DisconnectEx()重用1个socket,不用新建1个sokcet个人意见:
    不用要AcceptEx 和 DisconnectEx这2个函数,//纯属臆测,没经过实践
      

  2.   

    我就是不想closesocket,是为了重用socket才使用AcceptEx和DisconnectEx的DisconnectEx 并不等于 closesocket+socket,它只是执行传输层断开,然后准备好再次被AcceptEx使用而已。
      

  3.   

    学习了,原来是这样用的,用来控制最大连接数吗?还是节省内存?如果原理是样,DisconnectEx应该自带一个OVERLAPPED,
    那是不是说不用重新绑定端口了,CreateIoCompletionPort可省掉,
    呵呵,真的没这样做过,你试试吧?
      

  4.   

    DisconnectEx 的确可以带一个 OVERLAPPED,我目前就是这么使用的,
    我已经说过了,程序运行正常,没有什么问题,只是隐约觉得不太妥当。关于AcceptEx和DisconnectEx,你可以看下 《Windows 网络编程 第二版》所以我觉得这样子系统内部应该会存在这么一个已经绑定到该完成端口的句柄列表,在调用DisconnectEx时,并没有撤销,
    所以在重用该套接字时,只是它生效了而已,这样一来,如果在某个时刻有很多并发连接,那么,系统内部的这个句柄列表,
    就会一直维持一个比较大的数目,这样对系统来说,是不是一个不好的设计呢?我一直在想,为什么没有一个API可以把一个句柄从一个完成端口撤销。
      

  5.   

    完成端口模型在xp系统性能很差的的,建议在03server开发
      

  6.   

    你的大概意思总结如下:
    DisconnectEx 没有closesocket的过程,
    没有closesocket完成端口就会一直绑定这个socket,
    好象只有closesocket能把一个句柄从一个完成端口撤销,
    而你又不想用closesocket,感觉你在绕圈......开个玩笑,向你学习~
      

  7.   

    唉,算了,结贴,到时候实大不行我就closesocket呗,大不了不用AcceptEx,多开条线程来accept好了