监听以太网电缆拔下事件的TCP服务器应用程序(Listening for an Ethernet C

2019-06-23 22:16发布

我有一个C#TCP服务器应用程序。 我发现TCP客户端断线时,他们从服务器断开连接,但我怎么能检测到线缆拔事件? 当我拔掉网线我无法检测到断线。

Answer 1:

您可能要应用“查验”的功能,如果有TCP连接丢失会失败。 使用此代码扩展方法添加到插座:

using System.Net.Sockets;

namespace Server.Sockets {
    public static class SocketExtensions {
        public static bool IsConnected(this Socket socket) {
            try {
                return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
            } catch(SocketException) {
                return false;
            }
        }
    }
}

如果没有可用的连接方法将返回false。 它应该工作,以检查是否存在或者即使你对Reveice没有SocketExceptions没有连接/发送方法。 记住,如果你有不同之处在于有这样的关系到输连接错误信息,那么你就需要检查连接了。
这种方法是指使用时插座看起来像连接,但可能会在情况下,可以不喜欢。

用法:

if (!socket.IsConnected()) {
    /* socket is disconnected */
}


Answer 2:

尝试NetworkAvailabilityChanged事件。



Answer 3:

我发现这个方法在这里 。 它检查该连接的不同的状态和信号a断开。 但没有检测到拔出电缆 。 进一步搜索和反复试验后,这是我如何解决它最后。

由于Socket参数我用在服务器端,从接受的连接,并在客户端,客户端套接字连接到服务器的客户端。

public bool IsConnected(Socket socket)    
{
    try
    {
        // this checks whether the cable is still connected 
        // and the partner pc is reachable
        Ping p = new Ping();

        if (p.Send(this.PartnerName).Status != IPStatus.Success)
        {
            // you could also raise an event here to inform the user
            Debug.WriteLine("Cable disconnected!");
            return false;
        }

        // if the program on the other side went down at this point
        // the client or server will know after the failed ping 
        if (!socket.Connected)
        {
            return false;
        }

        // this part would check whether the socket is readable it reliably
        // detected if the client or server on the other connection site went offline
        // I used this part before I tried the Ping, now it becomes obsolete
        // return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);

    }
    catch (SocketException) { return false; }
}


Answer 4:

这个问题也可以通过设置像这样的KeepAlive套接字选项解析:

   socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
   socket.SetKeepAliveValues(new SocketExtensions.KeepAliveValues
   {
       Enabled = true,
       KeepAliveTimeMilliseconds = 9000,
       KeepAliveIntervalMilliseconds = 1000
   });

这些选项可以调整设置检查做多久,以确保连接有效。 在TCP保持活动的发送将触发插座本身来检测网线的脱节。



文章来源: Listening for an Ethernet Cable Unplugging Event for a TCP Server Application