如何检测客户端已与服务器断开连接?

在我的AcceptCallBack方法中有以下代码

static Socket handler = null;
public static void AcceptCallback(IAsyncResult ar)
{
  //Accept incoming connection
  Socket listener = (Socket)ar.AsyncState;
  handler = listener.EndAccept(ar);
}

我需要找到一种方法来尽快发现客户端已从handler套接字断开连接.

我试过了:

  1. handler.Available;
  2. handler.Send(new byte[1], 0, SocketFlags.None);
  3. handler.Receive(new byte[1], 0, SocketFlags.None);

当您连接到服务器并希望检测服务器何时断开连接但不起作用时,上述方法有效

任何帮助都将不胜感激.

推荐答案

由于在套接字断开连接时没有事件可用来发出信号,因此您必须以您可以接受的频率轮询它.

使用此扩展方法,您可以有一种可靠的方法来检测套接字是否断开连接.

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

.net相关问答推荐

我的Azure应用服务从哪里获取应用设置?

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

F#:跨度、提升和底部类型(或缺乏)

如何在选项卡中 Select Winforms NumericUpDown 中的所有文本?

在 WP7 中将 List 转换为 ObservableCollection

线程安全性的单元测试?

如何获取控制台应用程序的执行目录

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

在 Moq 中模拟泛型方法而不指定 T

来自奥尔森时区的 .NET TimeZoneInfo

将屏幕捕获为位图

HttpClient 和使用代理 - 不断得到 407

Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

C# 编译为 32/64 位,或任何 cpu?

将属性序列化为元素中的 Xml 属性

将 C# 编译为本机?

例外:不支持 URI 格式

C# - 在 WPF 应用程序中保存用户设置的方法?

如何判断uri字符串是否有效

如何为我的 C# 应用程序创建产品密钥?