- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 C# 编写一个需要处理传入连接的应用程序,而且我以前从未进行过服务器端编程。这让我想到以下这些问题:
提前致谢。
最佳答案
监听积压是,as Pieter said ,一个队列,操作系统使用它来存储已被 TCP 堆栈接受但尚未被您的程序接受的连接。从概念上讲,当客户端连接时,它会被放置在这个队列中,直到您的 Accept()
代码将其删除并将其交给您的程序。
因此,listen backlog 是一个调整参数,可用于帮助您的服务器处理并发连接尝试的峰值。请注意,这与并发连接尝试的峰值有关,与您的服务器可以维护的最大并发连接数无关。例如,如果您的服务器每秒接收 10 个新连接,那么调整监听积压不太可能产生任何影响,即使这些连接存在很长时间并且您的服务器支持 10,000 个并发连接(假设您的服务器未达到最大值)出服务于现有连接的 CPU!)。但是,如果服务器偶尔在每秒接受 1000 个新连接时遇到短时间,那么您可以通过调整监听积压以提供更大的队列来防止某些连接被拒绝,从而让您的服务器有更多时间调用 Accept()
为每个连接。
至于优点和缺点,优点是您可以更好地处理并发连接尝试的峰值,相应的缺点是操作系统需要为监听积压队列分配更多空间,因为它更大。所以这是性能与资源的权衡。
就我个人而言,我将 listen backlog 设为可以通过配置文件进行外部调整的东西。
调用 listen 和 accept 的方式和时间取决于您使用的套接字代码的风格。使用同步代码,您将使用一个值(比如 10)调用一次 Listen()
,用于监听积压,然后循环调用 Accept()
。对 listen 的调用设置了您的客户端可以连接到的端点,并在概念上创建了指定大小的监听积压队列。调用 Accept()
从监听积压队列中删除挂起的连接,设置应用程序使用的套接字并将其作为新建立的连接传递给您的代码。如果您的代码调用 Accept()
、处理新连接并循环再次调用 Accept()
所花费的时间长于并发连接尝试之间的间隔然后您将开始在监听积压队列中积累条目。
对于异步套接字,它可能会有点不同,如果您使用异步接受,您将像以前一样监听一次,然后发布多个(同样可配置的)异步接受。随着其中每一个的完成,您将处理新连接并发布新的异步接受。通过这种方式,您有一个监听积压队列和一个挂起的接受“队列”,因此您可以更快地接受连接(更重要的是,异步接受是在线程池线程上处理的,因此您没有一个紧密的接受循环)。这通常更具可扩展性,并为您提供两点调整以处理更多并发连接尝试。
关于c# - 关于sockets的listening和backlog的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4253454/
我正在尝试捕捉评论状态事件,例如有人正在关闭它。并在从插件中获得任何生命迹象之后。向日志文件(从任何日志级别)或 STDOUT 发送一行。atlassian-plugins.xml 看起来像这样:
我在跑; sass --watch --style compressed --sourcemap css/sass:css 我得到了; NameError: uninitialized constan
您好,我正在创建一个 android 应用程序作为 ejabbered 服务器的 XMPP 客户端。 但我真的很困惑,因为我看到我可以将消息作为数据包或消息发送,我也可以使用 PacketListen
我有一个 imageview - 它的属性 -focusable 和 focusableintouchmode 都设置为 true 我已经在我的 Activity 中实现了 onFocus
我有一个查询来查找指定条形码的文档 ID: Future findBarcode() async { String searchBarcode = await BarcodeScanner.sca
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
这可能是一个非常基本的问题,但我就是不明白。使用 Express.js 创建应用和启动应用监听 1234 端口有什么区别,例如: var express = require('express'); v
所以我想知道什么是更好看的解决方案/有什么区别以及在决定制作多个监听器(1 个监听器用于 1 个按钮)还是仅 1 个 ActionListener 用于 GUI 中的所有按钮(大约 10 个按钮),并
我目前正在尝试制作一个聊天室服务器。我正在努力做到这一点,以便我可以同时监听新请求的连接和监听从已建立的连接发送的消息。 我可以用它来监听请求的连接: def reqlisten(): glo
有没有办法在事件监听器方法中访问类上下文并有可能删除监听器? 示例 1: import {EventEmitter} from "events"; export default class Event
应用程序在本地主机上工作正常。但是当它连接到服务器时出现错误。 我通过端口 22 连接服务器 这是错误 Error: listen EADDRNOTAVAIL Error: listen EADDRN
我有类似的东西: $scope.$on(config.SOME_CONSTANT, ()=> { activate(); // plus a bunch of instantiatio
我的 HTML 页面上有以下 Controller : ... ... 此子 Controller 映射到以下 c
我的 HTML 页面上有以下 Controller : ... ... 此子 Controller 映射到以下 c
我构建了一个自定义属性并将其添加到可观察列表中。但是,如果属性内容发生更改,则不会调用任何监听器。以下代码片段向您展示了“建筑”: public static final class TestObje
这里我不明白这两种方法的基本区别是什么。 var events = require('events'); var eventEmitter = new events.EventEmitter(); v
我正在尝试使用 grunt-express 设置 Grunt 来启动我的 Express 服务器。读完docs后和 this SO question ,我还是想不通。我已经为我的 Grunt 文件尝试
如果这里问题的某些方面不清楚,我深表歉意,因为我是 Node 和 javascript 的新手。请询问更多详情 我有一个使用 socketio 连接到 firebase 的 Node 应用程序。在 h
情况 我可能没有使用传统意义上的 PHPUnit。我正在使用带有 Selenium 2 的 PHPUnit。我们有这个想法来记录 Selenium 以“重现步骤”的方式执行的操作。这意味着如果我们调用
我正在尝试学习在 struts2 中使用 session 。所以,我只想实现一个登录/注销、配置文件应用程序。我正在关注互联网上提供的基本教程。但是,它根本不起作用。请帮助我解决以下问题如何解决。 S
我是一名优秀的程序员,十分优秀!