用Socket,UDP协议,客户端向服务器发送登陆请求后,服务器就获得了客户端的通信IP和端口(System.Net.IPEndPoint),然后通过它用定时器持续地向客户端发送数据。
而假如客户端关闭了应用程序后,服务器与客户端的通信自然就会断开。此时,服务器调用System.NetSocket.ReceiveFrom 会持续地捕获到一个编号为10054的Socket错误(远程主机强迫关闭了现有的一个连接),因为服务器正在用定时器不断地往已不能用的远程端口发送数据。
现在的问题是:
如何在得到上述10054错误(远程主机强迫关闭了现有的一个连接)后,判断到底是哪个远程主机关闭了现有的一个“连接”。
补充两点:1、UDP是无连接的协议;2、服务器正同时与多个远程客户端通信。

解决方案 »

  1.   

    參考
    http://topic.csdn.net/t/20031218/18/2578622.html
      

  2.   

    谢谢boblaw,让客户端定时地发送UDP数据报表明自己“正在线”确实是一个可行的办法。但是我想知道有没有更好的方式。
    因为在用ReceiveFrom时分明就收到了“远程主机连接断开”的异常,这表明可能会有某种方法来判断到底是其中哪个远程主机断开了连接。频繁地收到异常会影响程序性能的。假如我设置50秒未收到客户端的主动回应就认为断线,那么,我就可能会有50秒的时间是在不停地捕获到这个“远程主机强迫关闭了现有的一个连接”异常。
      

  3.   

    我用的就是异常,SocketException:编号为10054的Socket错误(远程主机强迫关闭了现有的一个连接)。但是目前我不知道用什么方式来得知到底是其中的哪一个远程主机断开了连接。
      

  4.   

    Socket.ReceiveFrom的每一個重載的參數列表都有要求提供一個EndPoint參數,這個就是遠程服務器。
    ReceiveFrom出錯,你就不要再從這個EndPoint接收了
      

  5.   

    UDP 是无连接的 ,只有通过一定时间检验服务器是否与客户端 有通信,来解决的哦
      

  6.   

    回复第7楼:
    当我遇到错误时,EndPoint正处于不可用状态,无法查看。(当有多个客户端时)无法判断该停止与哪个IP:端口之间的通信。
    这正是问题之关键所在。
      

  7.   

    EndPoint正处于不可用状态??
    能看下代碼?