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

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(使用前将#替换为@)

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

  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • VBA 中的多线程

    这里有人知道如何让VBA运行多线程吗 我正在使用 Excel 无法用 VBA 本地完成 VBA 构建在单线程单元中 获得多个线程的唯一方法是使用 VBA 之外的其他具有 COM 接口的东西构建 DLL 并从 VBA 调用它 信息 OLE 线
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 使用 Matplotlib、PyQt 和 Threading 进行实时绘图导致 python 崩溃

    我一直在努力研究我的 Python 应用程序 但找不到任何答案 我有 PyQT GUI 应用程序 它使用 Matplotlib 小部件 GUI 启动一个新线程来处理 mpl 小部件的绘图 恐怕我现在通过从另一个线程访问 matplotlib
  • python 中的异步编程

    python 中有异步编程的通用概念吗 我可以为一个函数分配一个回调 执行它并立即返回主程序流 无论该函数的执行需要多长时间吗 您所描述的 主程序流程在另一个函数执行时立即恢复 不是通常所说的 异步 又名 事件驱动 编程 而是 多任务 又名
  • DotNET 应用程序中的 GDI 句柄

    我的纯 DotNET 库作为非托管桌面应用程序中的插件运行 我收到了稳定的 虽然低 崩溃报告流 这些报告似乎表明 GDI 句柄存在问题 错误消息中的字体等 恢复为系统字体 各种控件的显示崩溃 不久后发生大规模崩溃 我的窗体几乎没有控件 但我
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 当可能存在迭代器时替换并发集合是否是线程安全的?

    我一直在阅读各种内容 似乎这应该有效 但我想确定一下 我有一个静态属性 它应该是一个缓存 加上一些与缓存数据相关的其他功能 它将实际数据存储在 ConcurrentBag 中 并且有一个 IEnumerable 方法来 过滤并 从此包中生成
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato

随机推荐