C# 异步 TCP 套接字:处理缓冲区大小和大量传输

2023-12-30

当使用阻塞 TCP 套接字时,我不必指定缓冲区大小。例如:

using (var client = new TcpClient())
{
    client.Connect(ServerIp, ServerPort);

    using (reader = new BinaryReader(client.GetStream()))
    using (writer = new BinaryWriter(client.GetStream()))
    {
        var byteCount = reader.ReadInt32();
        reader.ReadBytes(byteCount);
    }
}

请注意远程主机如何发送任意数量的字节。

但是,当使用异步 TCP 套接字时,我需要创建一个缓冲区,从而硬编码最大大小:

 var buffer = new byte[BufferSize];
 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null);

我可以简单地将缓冲区大小设置为 1024 字节。如果我只需要接收小块数据,那就可以了。但是如果我需要接收 10 MB 的序列化对象怎么办?我可以将缓冲区大小设置为 10*1024*1024...但是只要应用程序正在运行,这就会浪费恒定的 10 MB RAM。这很愚蠢。

所以,我的问题是:如何使用异步 TCP 套接字有效地接收大块数据?


两个示例并不等效 - 您的阻塞代码假设远程端发送了后续数据的 32 位长度。如果相同的协议对异步有效 - 只需读取该长度(是否阻塞),然后分配缓冲区并启动异步 IO。

Edit 0:

我还要补充一点,分配用户输入的缓冲区,尤其是网络输入的缓冲区大小,会带来灾难。一个明显的问题是拒绝服务 http://en.wikipedia.org/wiki/Denial_of_service当客户端请求一个巨大的缓冲区并保留它时(比如发送数据非常缓慢)并阻止其他分配和/或减慢整个系统时,就会发生攻击。

这里的常识是一次接受固定数量的数据并进行解析。这当然会影响您的应用程序级协议设计。

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

C# 异步 TCP 套接字:处理缓冲区大小和大量传输 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • pthread_mutex_lock是如何实现的

    我只是想知道Unix内部如何实现线程间同步相关的功能 例如 当我打电话时会发生什么pthread mutex lock 有使用中的指针吗 参考源代码确实会有帮助 它既复杂又因 Unix 变体而异 例如 在 Linux 中 使用称为 Fute
  • 在Vue Bootstrap中动态生成指令名称

    我正在使用 Vue bootstrap 中的下拉菜单 并且我想在其中包含可折叠元素 我想要完成的是有一个按钮可以打开和关闭可折叠列表中的每个元素 Vue bootstrap 执行此操作的方式是为可折叠元素提供一个与按钮的指令名称相匹配的 i
  • 在 OS X 上的 Qt 4.8.6 中更改 QGLWidgets 的 OpenGL 上下文版本

    我想使用 Qt 4 8 6 通过 QGLWidget 渲染 OpenGL 内容 我正在使用的机器是装有 OS X 10 9 4 的 MacBook Pro QGLWidget 是通过传递带有 3 2 核心配置文件的请求格式版本的 QGLFo
  • 使用 scala argonaut 编码嵌套类

    我正在尝试对以下案例类进行编码 解码 case class Person name String age Int childs List Person 使用以下代码 object Person implicit def PersonCode
  • 如何在 Scala/Java 方法中通过反射获取参数名称和类型?

    我们可以使用反射来获取方法名称 如下所示 object Foo def bar name String age Int val foo Foo getClass val methods foo getMethods filter getNa
  • 在 python x64 上安装 TA-Lib

    我正在尝试在 Python 上安装 TA Lib 我使用的是 x64 版本 因此无法使用 pip 安装 Ta Lib 我正在跟进these https github com afnhsn TA Lib x64运行它的步骤 但我还没有明确第
  • C 中的“++”操作是原子操作吗?

    我正在尝试确定是否有如下声明 value assuming value is a global variable 是一个原子操作 我需要知道该计算是否能够被写入同一全局变量的中断服务例程中断 对于没有原子类型的对象 标准从不将 定义为原子操
  • 模拟器不会在 Visual Studio 2010 中显示

    我已经遇到这个问题一周了 并在互联网上尝试了很多解决方法 但没有结果 这是我的情况 我正在尝试在 Windows 8 x64 主机上安装 Windows Phone SDK 7 1 我遵循的步骤是 为 Marketplace 客户端安装的
  • 为什么要定义教会数字

    我想了解为什么 Church 将这些数字定义为 0 f x x 1 f x f x 2 f x f f x 3 f x f f f x 4 f x f f f f x 背后的逻辑是什么 为什么0代表如下 0 f x x 丘奇并不想变得实际
  • XAML 绑定属性

    Hi 有人可以向我指出某种文档 其中包含 Binding 类提供的属性及其值类型的完整列表
  • 在 JavaFX 表中拖放?

    我正在将 JavaFX 2 表用于某种播放列表 并且我希望能够拖放表中的行 例如将第 3 行拖到第 2 行之前 就像您从典型媒体播放器的播放列表中拖放的内容一样 例如Winamp AIMP 那可能吗 有相关的代码示例吗 非常感谢 试试这个
  • 了解 kafka 流分区分配器

    我有两个主题 一个有 3 个分区 一个有 48 个分区 最初我使用默认分配器 但是当消费者 kubernetes 中的 pod 崩溃时我遇到了一些问题 发生的情况是 当 Pod 再次启动时 它从具有 3 个分区的主题重新分配分区 并从具有
  • Twitter Bootstrap:停止输入字段超出范围

    我在尝试解决此问题时遇到困难 文档说我应该将跨度设置为等于父跨度 但是 当我这样做时 它会延伸到井容器的右侧 在移动设备上查看时看起来不错 将适当的量延伸到右侧 填充井 但是 它在桌面上效果不佳 我希望字段延伸到井内 div class c
  • 使用 R 进行时间序列预测

    我有以下 R 代码 library forecast value lt c 1 2 1 7 1 6 1 2 1 6 1 3 1 5 1 9 5 4 4 2 5 5 6 5 6 6 2 6 8 7 1 7 1 5 8 0 5 2 4 6 3
  • 如何在触发器上将选定数据从一个工作表复制到另一个工作表

    我编写了一个脚本来通过全局变量收集数据 var row sheet getActiveSelection getRowIndex var mfg sheet getRange M row getValue toUpperCase var c
  • 列出文件时出现中文编码问题

    我正在运行 Java 应用程序Solaris10 with Chinese 现在目录下有一些中文文件名的文件 当我做files new File dir list 其中 dir 是包含该中文文件的父目录 我得到结果文件名files 0 as
  • 如果分支已更新特定目录中的文件,则运行 github 操作

    文件结构 apps app 1 app 2 libs lib 1 lib 2 我们有一些测试 只有在文件发生更改的情况下才应该运行lib 2 我尝试过做 on push paths libs lib 2 但它仅在文件来自lib 2被推送到提
  • 在 R 中安装 tabulizer 包

    我正在使用 R 版本 3 4 0 我的电脑是 64 位 Windows 10 我想在 R 中从 PDF 文档中提取数据帧 我尝试使用 github 安装 tabulizer 包 但出现以下错误 gt ghit install github
  • video.js - 控件在 IE8 中不显示

    我正在实现 videojs 并让它在所有浏览器中工作 但是控件不可见 并且播放按钮在 IE8 中被 Flash 后备损坏 经过一番挖掘 我通过链接到 cdn 确保使用最新版本的 js 和 css 看到了对 boxWidth box offs
  • C# 异步 TCP 套接字:处理缓冲区大小和大量传输

    当使用阻塞 TCP 套接字时 我不必指定缓冲区大小 例如 using var client new TcpClient client Connect ServerIp ServerPort using reader new BinaryRe