有几年没编程了,也没来论坛.
最近因为一些事情,还得自己亲自动手.(悲哀)在网络上看了些IOCP的文章,有一些不明白,恳请知者畅言,先谢了有例子在IOCP的工作Thread中,调用GetQueuedCompletionStatus中判断返回值为false并且byteTransfer=0
就判断客户端已经断开.这点我不太理解.如果客户端只是连接,暂时没有数据发送,是不是就会出现上述情况???

解决方案 »

  1.   

    GetQueuedCompletionStatus中判断返回值为false 表示套接字上有错误发生,并不能判断客户端已断开判断客户端已断开:
       byteTransfer=0 并且 per-I/O数据中的nOperationType 为 OP_READ 或 OP_WRITE 这样才表示客户端断开了。
      

  2.   

    我有个项目也想用IOCP做,现在还没什么头绪,楼主做的怎么样了?可以交流下经验吗。
      

  3.   


    因为对IOCP还没完全理解,暂时放了下来.看了网络上的资料,从IOCP读数据都有比较清楚的交代,
    向IOCP写数据,我都没看懂.
    不知道是不是可以取得socket,直接向socket写,那就不关IOCP的事,不知可否?
      

  4.   

    多谢回复.
    你所提到的per-I/O数据中的nOperationType 为 OP_READ 或 OP_WRITE,不是通用的代码吧?另外想请教:
    如果有个客户端连接上IOCP服务器,但是没有收发数据,请问服务器程序会不会阻塞在某个地方?(thread内阻塞也算)
      

  5.   

    多谢回复.
    你所提到的per-I/O数据中的nOperationType 为 OP_READ 或 OP_WRITE,不是通用的代码吧?
    ***************************
    OP_READ 或 OP_WRITE,都是自己定义的标识当前投递回来的信息的类型,不是通用的代码。另外想请教:
    如果有个客户端连接上IOCP服务器,但是没有收发数据,请问服务器程序会不会阻塞在某个地方?(thread内阻塞也算)
    ********************************************
    服务器程序是否会阻塞在某个地方不是由socket是否有数据送达来决定的,而是由IOCP端口上是否有信息来决定的,当然,如果所有的socket都没有任何行为,那么所有的线程都是阻塞的
      

  6.   

    很简单没有条件创造条件;使用标记SO_KEEPALIVE;拔掉网线,再插回去;时间超时一定掉;在设置SO_KEEPALIVE返回GetLastError确定创建标记成功;