【问题标题】:C # Socket - How to detect if my client has lost connectionC# Socket - 如何检测我的客户端是否丢失连接
【发布时间】:2013-07-01 13:09:49
【问题描述】:

我有一个连接到服务器套接字的应用程序客户端,我有一个功能可以检测何时发生断开连接:

public static class SocketExtensions
{
    public static bool IsConnected(this Socket socket)
    {
        try
        {
            return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
        }
        catch (Exception ex) 
        {
            Trace.Exception(ex, true);
            return false; 
        }
    }
}

但有时这个功能检测不到断线,我一直在发送数据包,但服务器没有响应(每 5 秒发送一次轮询消息):

12:04.40.079 ; polling ================>    3|11111 ; 
12:04.45.087 ; polling ================>    3|11111 ; 
12:04.50.094 ; polling ================>    3|11111 ; 
12:04.55.102 ; polling ================>    3|11111 ; 
12:05.00.109 ; polling ================>    3|11111 ; 

通常,我发送一条消息并接收另一条消息:

12:11.03.730 ; polling ================>    3|11111 ; 
12:11.03.746 ; received <================   4|11111 ; 

我必须关闭并再次运行我的应用程序才能再次建立通信。

如何检测我是否失去了与服务器的连接?

谁能帮帮我?

提前致谢!

【问题讨论】:

  • 我认为你想要的词是“polling”而不是“pooling”。

标签: c# sockets


【解决方案1】:

发送一个keep alive数据包来检测你是否失去了与服务器的连接,如果你向服务器发送了一个数据包但没有从服务器收到一个数据包,这并不意味着你已经失去了连接,你必须检查服务器端是否有另一个错误或客户端错误,调试您的服务器以查看您是否收到来自客户端的数据包,如果您收到来自客户端的数据包,那么您的连接没有丢失,它还活着。

【讨论】:

  • 你说得对,问题是我无法调试服务器,是另一个系统。还有其他想法吗?
  • 你自己创建了服务器吗?
  • 如果问题出在服务器端,那么在不检查服务器的情况下,您没有其他方法可以解决此问题,如果服务器没有发送数据,则客户端无法解决此问题。如果服务器接收到您发送的数据,则表示连接处于活动状态。如果您的客户端没有收到任何内容,则表示服务器没有发送数据,您必须调试服务器以解决此问题
  • 为什么不将远程调试器附加到您的服务器? ,然后你可以调试你的服务器,尽管它在另一个系统中。
  • 如果您想了解远程调试,请查看此链接stackoverflow.com/questions/17269663/…
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多