我有一个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