同一个套接字上可以进行多少个异步套接字请求?

2024-01-21

当我在套接字上调用 BeginSend 时,我传递一个委托,该委托将在数据发送后(由不同的线程)调用。

如果我在第一次尚未“回调”时再次调用 BeginSend 会发生什么?

发送数据的正确行为是什么?执行 BeginSend,然后在回调中执行 EndSend 并开始另一个发送?或者让多个 BeginSend 同时工作实际上是否明智?

这是 MSDN 上的 BeginSend 页面,它没有给出此问题的答案:开始发送 msdn http://msdn.microsoft.com/en-us/library/7h44aee9.aspx


正如 O.K.W.说,多个待定BeginSend通话会正常进行。不过,您可能确实需要记住一些事情。

首先,如果这是一个 TCP 套接字,那么这仍然是点对点之间的单个数据流。

其次如果你所有的BeginSend调用发生在同一线程上,那么结果将是对等方按照调用顺序接收数据。如果你的BeginSend调用从不同的线程发生,然后数据可能以任何顺序到达,因为每个发送之间可能存在竞争条件。这对您来说可能重要,也可能无关紧要(取决于您是否在每次发送时发送离散的完整消息)。

第三,如果您使用 TCP 并且发送速度比套接字另一端的代码可以接收的速度快,那么您可能会填充 TCP 窗口,并且 TCP 堆栈将开始对数据流执行流量控制。如果继续发出BeginSend那么您可能最终会遇到这样的情况:您的回调需要越来越长的时间来调用,因为服务器上的 TCP 堆栈将数据排队发送(只有在数据发送完毕后您才会收到回调,并且基于 TCP 窗口的流量控制将阻止发送新数据,直到 TCP 窗口不再“满”为止;即,对等方已为某些数据发送了 ACKin flight).

然后,您可能会遇到这样的情况:您以一种无法控制的方式耗尽发送机器上的资源(您发出BeginSend并且不知道它何时完成,并且每次发送都使用内存用于正在发送的缓冲区,并且可能non-paged pool在 Winsock 代码中...Non-paged pool是一个系统范围的资源,在 Vista 之前的操作系统上非常稀缺,如果出现以下情况,一些行为不良的驱动程序可能会蓝屏该框:non-paged pool是低或耗尽。此外,您还可能将内存页面锁定到内存中,并且锁定内存页面的数量还有另一个系统范围的限制。

由于这些问题,通常最好实现您自己的协议级流量控制,这限制了BeginSend可以在任何时间挂起的调用(也许使用协议级 ACK)或与 TCP 窗口流控制一起使用,并使用挂起发送的完成来发出新的发送,并且您可以将数据排队以在您自己的发送中发送内存,并完全控制所使用的资源以及在排队“太多”数据时要执行的操作。有关此内容的更多详细信息,请参阅我的博客文章:http://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.html http://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.html

看这个回复:当 tcp/udp 服务器发布速度快于客户端消费速度时会发生什么? https://stackoverflow.com/questions/1997691/what-happens-when-tcp-udp-server-is-publishing-faster-than-client-is-consuming/1998127#1998127有关 TCP 窗口流量控制的更多信息,以及当您忽略重叠 I/O(在 C++ 领域)并发出太多重叠发送时会发生什么情况...

总之,发布多个并发BeginSend调用是优化 TCP 数据流的方法,但您需要确保发送的速度不会“太快”,因为一旦发送,您就会以无法控制的方式消耗资源,这对机器来说可能是致命的您的代码正在运行。所以不要允许无限数量的BeginSend要求出色,并且最好对盒子进行概要分析,以确保您不会耗尽系统范围的资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同一个套接字上可以进行多少个异步套接字请求? 的相关文章

  • .NET - 将颜色名称字符串转换为 System.Drawing.Color

    将 red green yellow aliceblue 等字符串转换为实际的 System Drawing Color 值的最佳方法是什么 我正在查看反思 发现有些事情似乎不对劲 您可以使用 Color FromName
  • 将列添加到新的数据行

    是否可以创建一个新的 DataRow 对象并在运行时向其中添加列 How can I specify column names for this data row object DataRow row new DataRow 不 DataR
  • 具有多个图像列表和图标/图像的列表视图

    我需要一种在列表视图上使用两个图像列表的方法 其中一个图像列表用于包含 16x16 图标的标题图标 另一个图像列表将在子项目中包含 32x32 缩略图 下图显示了我正在尝试做什么 我找到了解决这个问题的技巧 诀窍是在 32x32 画布上创建
  • 从另一台计算机连接到 SQL Server

    我正在使用 C 连接到网络上另一台计算机上的 SQL Server 但收到一条异常消息 用户 用户名 登录失败 但是服务器日志状态表明使用 Windows 身份验证的用户连接成功 我的连接字符串是 Data Source ipaddress
  • 将 GUID 转换为整数并返回

    所以我有一个必须与之交互的第三方应用程序 该应用程序需要我的用户表中的用户ID 问题是我将我的 userID 存储为 GUID 而第 3 方应用程序仅接受整数 所以我想 如果有一种方法可以将 GUID 转换为整数 然后能够将其转换回来 当我
  • 获取同名方法的集合

    我有一些代码 用于帮助 url 路由 尝试在控制器中查找操作方法 我的控制器看起来像这样 public ActionResult Item int id MyViewModel model new MyViewModel id return
  • Java Servlet 中限制 HTTP 请求

    在 java servlet 中 如何根据客户端的 IP 地址限制来自用户的 http 请求 我不想每秒处理来自特定源 IP 地址的超过 X 个请求 其中 X 是可配置的并且具有 0 1 中的实际值 10 范围 从 10 秒内 1 个请求到
  • 在模块 CommonLanguageRuntimeLibrary 中找不到类型 System.ApplicationException

    我通过 CodenameOne 版本的 IKVM 运行了第 3 方 Android 库 并成功导入了输出 dll 作为对 Visual Studio 中的 UWP 应用程序的引用 在尝试编译该项目时 我收到一个构建错误 从错误列表窗口 在模
  • 如果我无限期地在后台运行 Android 线程会发生什么

    Android 文档表明 Oreo 对后台执行有新的限制 https developer android com about versions oreo background https developer android com abou
  • 静态EventHandler事件的发送者

    我有静态课程EventHandler event public static event EventHandler MyEvent static void RaiseEvent EventHandler p MyEvent if p nul
  • 使用返回哈希数组的外部 PHP SOAP Web 服务的 C# .NET 客户端存在问题

    我正在编写一个需要调用外部 Web 服务的 NET Web 应用程序 我提供的文档包括 PHP 代码示例 我可以使用提供给我的 WSDL 地址在 VS2010 中成功创建 Web 引用 并且使用 fiddler 我可以看到正在发送和接收预期
  • 在 .NET Core 3.1 中运行托管 C++/CLI 程序集时图像格式错误

    我非常兴奋地看到 NET Core 3 1 和 Visual Studio 2019 的最新预览版添加对托管 C CLI 项目的支持 https github com dotnet coreclr issues 18013 因为这样的项目是
  • 如何使用 NUnit(或者可能使用其他框架)测试异步方法?

    我有一个 ASP NET Web API 应用程序 带有一个具有异步方法的 ApiController 返回Task lt gt 对象并标有async关键词 public class MyApiController ApiControlle
  • 运行命令行进程并在该进程仍在运行时获取输出?

    如何运行命令行进程并在该进程仍在运行时获取输出 我的意思是使用自己的进度条运行 CLI 进程 可执行文件本身需要很长时间才能完成操作 所以我想从自己的进程中获取进度信息来显示我的应用程序中的进度 否则我不这样做在进程完成之前没有任何信息来显
  • 我可以举一个使用 runOnUiThread 显示 toast 的示例吗?

    我搜索了很多地方 但找不到 runOnUiThread 实现的完整工作示例 我尝试了很多 但出现了很多错误 我只想显示线程中的吐司 这是最终的完整代码 感谢所有回复的人 import android app Activity import
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • 如何在 ZeroMQ 套接字中检索和存储随机 UUID?

    我需要在多个客户端之间进行通信 当我尝试运行文件 多个终端 时 我得到相同的身份 所以我让路由器套接字自动设置UUID 但我发现我无法使用该身份存储在服务器上以在多个客户端之间进行路由 我如何处理多个客户端 ID 我正在尝试构建一个异步聊天
  • Objective-C 2.0中的多线程问题

    我有我的主应用程序委托 其中包含一个返回对象的方法 该应用程序委托在主线程上运行 我还有一个在不同线程上运行的 NSOperation 除了希望有时能够在主线程上调用我的应用程序委托方法之外 我还需要从 NSOperation 线程中调用它

随机推荐