在完成端口中 如果我通过心跳方式 检测到某一client 断线
但是他断线时 GetQueuedCompletionStatus 并没有返回我用 closesocket来关闭该连接时 原来在该socket上投递的io 操作会在 GetQueuedCompletionStatus 中返回吗?

解决方案 »

  1.   

    如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们
    一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体
    应用的要求(即让没发完的数据发送出去后在关闭socket)?
    struct linger {
      u_short    l_onoff;
      u_short    l_linger;
    };
    linger m_sLinger;
    m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
    // 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
    m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
    setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
    Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;
         2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;