我这样建立一个聊天室的
    在服务器端建立监听后,客户端发出连接请求,服务器端接受连接请求后建立一个Socket与之相连,
并保存在CobList链表中.
    有一个问题,当一端关闭Socket,另一端如何得知,应如何处理.
    当客户端关闭Socket,服务器端如何从CobList中取出Socket做相应处理.
    那位仁兄能告诉我,谢谢!
    急切等待!
    请不要灌水,谢谢!

解决方案 »

  1.   

    客户端关闭连接时,会导致客户tcp发送一个FIN给服务器,服务器tcp则已ACK响应
      

  2.   

    当shutdown是graciously的时候,可以收到
    CLOSE(OnClose)的提示。
      

  3.   

    是不是说,当一端关闭Socket后,另一端会自动调用onclose(),相应操作可在onclose中进行处理,
    那么在onclose()中,还需要调用close()在这一端也关闭Socket吗?
      

  4.   

    正常关闭socket的话,按协议会发送TCP的FIN给另一端,在CSocket中就是触发OnClose,然后操作就可以在OnClose中完成了,删除列表中socket对象
      

  5.   

    同意oyljerry(☆勇敢的心☆→㊣Project Coding㊣)
    通常,关闭的时候就只要在OnClose里面处理就可以但是如果客户端非法关闭,那么,服务端的socket状态就会变成CLOSE_WAIT,需要等待一些时间才能关闭,这个问题也困惑着我,达人也给说说我是直接用MFC的封装socket
      

  6.   

    >>需要等待一些时间才能关闭这个是等待 TCP Timeout 的原因。
      

  7.   

    >>问楼上,请问有方法让它不用等待吗?最好有代码,试过好多设置都不行
      

  8.   

    答楼上:
    TCP 的 Timeout是协议层的东东,无法变更的。
    但是对于一般情况,有一种事实上通用的“HeartBeat”方法。这种方法可以处理非正常关闭的情况。虽然不能处理链路异常,但是也足够用了。无论是网络上还是csdn,都有很多heartbeat的贴子。搜索一下就可以了。
      

  9.   

    嗯,用HeartBeat包来检查非正常关闭
    这个超时是协议中设计的