TcpListener 排队连接的速度比我清除连接的速度快

2023-11-21

据我了解,TcpListener一旦您致电,将对连接进行排队Start()。每次你打电话AcceptTcpClient (or BeginAcceptTcpClient),它将从队列中出列一项。

如果我们负载测试我们的TcpListener通过一次向应用程序发送 1,000 个连接,队列的构建速度远远快于我们清除它的速度,导致(最终)客户端超时,因为它没有得到响应,因为它的连接仍在队列中。然而,服务器似乎并没有承受太大的压力,我们的应用程序没有消耗太多的 CPU 时间,并且机器上的其他受监控资源也没有消耗太多的时间。感觉我们现在的运行效率还不够。

我们正在打电话BeginAcceptTcpListener然后立即移交给ThreadPool线程实际完成工作,然后调用BeginAcceptTcpClient再次。所涉及的工作似乎并没有给机器带来任何压力,基本上只是 3 秒的睡眠,然后进行字典查找,然后将 100 字节写入到TcpClient的流。

这是TcpListener我们正在使用的代码:

    // Thread signal.
    private static ManualResetEvent tcpClientConnected = new ManualResetEvent(false);

    public void DoBeginAcceptTcpClient(TcpListener listener)
    {
        // Set the event to nonsignaled state.
        tcpClientConnected.Reset();

        listener.BeginAcceptTcpClient(
            new AsyncCallback(DoAcceptTcpClientCallback),
            listener);

        // Wait for signal
        tcpClientConnected.WaitOne();
    }

    public void DoAcceptTcpClientCallback(IAsyncResult ar)
    {
        // Get the listener that handles the client request, and the TcpClient
        TcpListener listener = (TcpListener)ar.AsyncState;
        TcpClient client = listener.EndAcceptTcpClient(ar);

        if (inProduction)
            ThreadPool.QueueUserWorkItem(state => HandleTcpRequest(client, serverCertificate));  // With SSL
        else
            ThreadPool.QueueUserWorkItem(state => HandleTcpRequest(client));  // Without SSL

        // Signal the calling thread to continue.
        tcpClientConnected.Set();
    }

    public void Start()
    {
        currentHandledRequests = 0;
        tcpListener = new TcpListener(IPAddress.Any, 10000);
        try
        {
            tcpListener.Start();

            while (true)
                DoBeginAcceptTcpClient(tcpListener);
        }
        catch (SocketException)
        {
            // The TcpListener is shutting down, exit gracefully
            CheckBuffer();
            return;
        }
    }

我假设答案将与使用有关Sockets代替TcpListener,或者至少使用TcpListener.AcceptSocket,但我想知道我们该怎么做?

我们的一个想法是打电话AcceptTcpClient并立即Enqueue the TcpClient成多个之一Queue<TcpClient>对象。这样,我们就可以在单独的线程上轮询这些队列(每个线程一个队列),而不会遇到可能在等待其他线程时阻塞线程的监视器。Dequeue运营。然后每个队列线程可以使用ThreadPool.QueueUserWorkItem完成工作ThreadPool线程,然后继续使下一个线程出列TcpClient在其队列中。您会推荐这种方法吗?还是我们正在使用的问题TcpListener再多的快速出队也无法解决这个问题吗?


我已经编写了一些直接使用套接字的代码,但我缺乏对 1000 个客户端执行负载测试的方法。您能否尝试测试一下这段代码与您当前的解决方案相比如何?我对结果非常感兴趣,因为我正在构建一个现在也需要接受大量连接的服务器。

static WaitCallback handleTcpRequest = new WaitCallback(HandleTcpRequest);

static void Main()
{
    var e = new SocketAsyncEventArgs();
    e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);

    var socket = new Socket(
        AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Bind(new IPEndPoint(IPAddress.Loopback, 8181));
    socket.Listen((int)SocketOptionName.MaxConnections);
    socket.AcceptAsync(e);

    Console.WriteLine("--ready--");
    Console.ReadLine();
    socket.Close();
}

static void e_Completed(object sender, SocketAsyncEventArgs e)
{
    var socket = (Socket)sender;
    ThreadPool.QueueUserWorkItem(handleTcpRequest, e.AcceptSocket);
    e.AcceptSocket = null;
    socket.AcceptAsync(e);
}

static void HandleTcpRequest(object state)
{
    var socket = (Socket)state;
    Thread.Sleep(100); // do work
    socket.Close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TcpListener 排队连接的速度比我清除连接的速度快 的相关文章

  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 如何从 webmethod 向 AJAX 调用返回异常?

    我回来了List
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • 等于方法实现助手 (C#)

    每次我编写一些数据类时 我通常都会花很多时间编写 IEquatable 实现 我写的最后一堂课是这样的 public class Polygon public Point Vertices get set 实施 IEquatable 是一项
  • Apple IOS 上的 C# 应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有基于 C Net 的应用程序 有什么方法可以在 Apple IOS 上运行这些应用程序吗 我没有资
  • 获取进程的所有 DLL

    我想获取为给定进程加载的所有 dll 的列表 我目前正在使用 NET框架4 0 我知道有一个bug https connect microsoft com VisualStudio feedback details 546430 syste
  • 使用 OpenSSL 库在 C++ 中生成 SHA 哈希值

    如何使用以下命令生成 SHA1 或 SHA2 哈希值OpenSSL https openssl org图书馆 我搜索了谷歌 找不到任何函数或示例代码 从命令行来看 很简单 printf compute sha1 openssl sha1 您
  • 为什么C++中没有“NULL引用”?

    我正在阅读 C 常见问题解答 8 6 什么时候应该使用引用 什么时候应该使用指针 http www parashift com c faq lite refs vs ptrs html 特别是以下声明 可以时使用引用 必要时使用指针 上述情
  • 为什么这段代码不会产生编译错误?

    template
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • vs2010 c++ 通过debug查看指针内容

    我正在使用 Vs2010 c 处理 2D 数组 我从一维指针开始 并使用操作 如下 class CMatrix void clear public int nRows int nCols short MyMat CMatrix CMatri
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么

随机推荐

  • WidgetBundle 根据某些逻辑返回小部件

    我已经为我的应用程序准备了几个 iOS14 主屏幕小部件 并将它们全部返回WidgetBundle像这样 main struct WidgetsBudle WidgetBundle WidgetBundleBuilder var body
  • 辅助功能服务 - PerformGlobalAction() 返回 false

    我正在创建一个Android无障碍服务哪个调用执行全局动作 at onStartCommand public int onStartCommand Intent intent int flags int startId Log d serv
  • Git-Tfs:每个 Git 提交都有一个 TFS 变更集?

    在工作中 我们使用 TFS 我正在尝试让 Git TFS 工具正常工作 以便在将本地提交推送到我们的 TFS 存储库之前在处理本地提交时拥有更大的灵活性 我有这个工作 但是当我做一个git tfs ct 它将我的所有提交检查到一个 TFS
  • CSS 网格中的等宽列

    我想让下面的 html 在 n 个相等的列中显示 使用 css 网格的行元素是否有两个 三个或更多子元素 Flexbox 使这很容易 但我无法使用 css 网格完成它 任何帮助受到赞赏 div class row div class ite
  • 有没有办法在 iOS 7 中禁用键盘的透明度?

    我想要一个带有不透明键盘的键盘 我无法使用任何受支持的 UIKeyboardTypes 获得此键盘 还有其他办法解决这个问题吗 我想我可以用我想要的颜色覆盖键盘下的背景视图 有没有一种好的方法可以使背景视图与键盘显示动画同步 当使用 iOS
  • 使用 stat_summary 用观察数来注释绘图

    我该如何使用stat summary标记一个图n x哪里x一个变量 这是所需输出的示例 我可以用这个相当低效的代码来制作上面的图 nlabels lt sapply 1 length unique mtcars cyl function i
  • Mercurial 如何处理分割的文件?

    Mercurial 如何处理分割的文件 如果我创建一个分支并拆分一个文件会发生什么 我可以轻松地从修改原始未分割文件的另一个分支中提取更改吗 我只是做了一个小实验 我创建了一个存储库 foo 与一个大文件 然后我将其克隆到bar used
  • JSF 在 SVG 之后吞掉结束标签

    我用的是两个
  • 停止 MySQL 在 UNIQUE 约束中容忍多个 NULL

    Mysql 架构是 CREATE TABLE Foo bar INT NULL name VARCHAR 59 NOT NULL UNIQUE name bar ENGINE INNODB MySQL 允许重复以下语句 从而导致重复 INS
  • 当方法仅在 return 语句处等待时,将方法标记为异步是否有用? [复制]

    这个问题在这里已经有答案了 只有下面方法的最后一行在方法返回之前使用了 await 所以这是否意味着该方法基本上是同步的 应该只调用 Get 而不使用 async 修饰符和后缀 Async public virtual async Task
  • malloc分配的对象的动态类型是什么?

    C 标准引用术语 动态类型 C 标准在类似上下文中引用 有效类型 例如 如果程序尝试通过访问对象的存储值glvalue除以下类型之一外 行为未定义 对象的动态类型 但是对象的动态类型是如何分配的malloc决定 例如 void p mall
  • Neo4j 中每个查询返回前 n 个结果

    我一直在尝试在密码查询中执行以下任务 但没有得到正确的结果 其他 stackoverflow 问题讨论了 limit 或collect 但我认为这不足以完成以下任务 任务 我有 p Product 节点 并且两个产品节点之间存在一种名为 B
  • 递归列表展平

    我可能可以自己写这个 但我试图完成它的具体方式让我失望 我正在尝试编写一种类似于 NET 3 5 中引入的其他方法的通用扩展方法 该方法将采用 IEnumerable 的嵌套 IEnumerable 等等 并将其展平为一个 IEnumera
  • 使用 PHP 检查 AllowOverride 值?

    无论如何 有没有使用PHP来检查的值AllowOverride太看看是否 htaccess会有什么影响吗 我不知道有什么干净 直接的方法可以做到这一点 如果您对要检查的文件夹具有 http 访问权限 则可以在 htaccess 文件中写入一
  • 使用 Spark-on-k8s-operator 在 Kubernetes 上运行 Pyspark 的依赖性问题

    我花了几天时间试图找出在 Kubernetes 上运行 Py Spark 时遇到的依赖问题 我正在使用k8s 操作符上的 Spark以及 Spark 的 Google Cloud 连接器 当我尝试提交我的 Spark 作业时without使
  • PYTHON:使用 python 变量更新多列

    我正在尝试编写一个有效的 mysql 语句 该语句允许我使用作为 python 变量提供的值来更新一条记录中的多个列 我的声明如下 db MySQLdb connect host localhost user user passwd pas
  • 将阵列的一小部分旋转 90 度

    我想旋转一个数组 但不是整个数组 而是它的一小部分 我有 512X512 数组 基本上它是一个位于中心 150 150 半径为 200 的高斯圆 现在我只想将数组的一小部分 以 150 150 为中心 半径为 100 旋转 90 度 最初我
  • 为什么我需要使用rails / ajax在远程链接上添加“data:{type:“script”}”

    在我的一个项目中 代码 link to add new me category path class btn btn success remote true 可以正确加载远程表单 但有些无法工作 浏览器没有执行响应代码 我需要添加 data
  • 如何在 PHP 中使用 IN 子句的查询中使用准备好的语句[重复]

    这个问题在这里已经有答案了 我需要做一个简单的查询 array of ids array poulate array of ids they don t come from another db but from Facebook so i
  • TcpListener 排队连接的速度比我清除连接的速度快

    据我了解 TcpListener一旦您致电 将对连接进行排队Start 每次你打电话AcceptTcpClient or BeginAcceptTcpClient 它将从队列中出列一项 如果我们负载测试我们的TcpListener通过一次向