我程序的socket采用同步数据传输,因为我觉得这样对于传输文件什么的可能比较方便处理的,特别是处理相应信号时。但是这样有一个问题啊,怎样得知客户端已经和服务端断开连接了呢?还请各位帮忙

解决方案 »

  1.   

    如果使用CSocket,重载CSocket::OnClose()
    如果使用API关注FD_CLOSE
      

  2.   

    使用Winsock的I/O模式(WSAAsyncSelect or WSAEventSelect)当这些I/O的处理代码得到FD_CLOSE消息时,判断错误代码是否是WSAECONNABORTED,如果是就说一方已经断开。
      

  3.   

    但是使用FD_CLOSE的话,那不是把套结字置为异步模式了吗?
    这样对后来的数据处理岂不是很麻烦?
      

  4.   

    不麻烦
    我看到还有一种好象是判断recv 的返回值是不是 0 0 代表已经断开。
      

  5.   

    网络连接断开可以分为两种:1.正常断开.
    这类问题可以处理.2.非正常断开.
    a. 客户端主机突然停电、被损坏、网线被剪断,这是一类;
    b. 客户端进程被结束任务程序强行中止, 此时物理连接是完好的.对于非正常断开, TCP/IP 协议不能检测, 这是 TCP/IP 的设计问题, 只能通过发送数据包来检测.
    如 HeartBeat 包. 只要包不能正常发送出去, 不管是基于上述何种原因, 都可以认为网络已经断开.在你的程序中加入两对 Socket ,其中一对用来发送 HeartBeat 包,每隔单位时间发送一次.
    出错则认为网络已经断开.对于非正常断开, 两对 SOCKET 必然同时断开,这样就可以处理非正常断开了
      

  6.   

    设置保活定时器,发送HeartBeat包来保持连接
      

  7.   

    服务端异常中断(断点重启,)按TCP协议,会发送一个RST包,让客户端中断连接
      

  8.   

    mingbao(★情已逝★) 大虾,说得非常有道理,往往在我们实际应用过程中是不能100%的保证收到close事件的,只有通过心跳包来检测链路,但是偶有一点不能勾同 mingbao(★情已逝★) ,用两个socket,好像还是有漏洞。比如说网络不稳定情况。其实网络是通的,但是正好心跳socket没有发送数据出错,这个时候你认为网络断了,但是实际上网络没有断,你看这种情况会不会发生?
      

  9.   

    以前搞过一个项目, 用第三方软件, PCTCP来实现 SCO UNIX和 纯DOS的应用的连接, 可以设定断线反应时间, 我设了一秒, 于是只要一断, DOS方就立即知道, 这是6年的搞的, 至今觉得是最好的!
      

  10.   

    当socket onIdle()的时候发送数据包给指定服务器
    服务器收到数据后ECHO,client设置收发延时在指定的
    时间没收到数据包断开连接