.net/C# 中的网络

2024-03-19

有人可以为我指明学习如何在 C#/.net 3.5 中进行网络连接的正确方向吗?欢迎提供代码示例和解释。基本上我正在寻找如何进行异步/多线程服务器/客户端模型。

我对如何使用 WinSock 在 C++ 中实现这一点的基础知识相当满意,但尽管我所有的研究似乎都无法掌握 C# 中的这个概念。

感谢您提供的任何帮助:)


如果WCF满足你的需求,那么值得一看。ZeroC http://www.zeroc.com和其他替代的更高级别的库存在。否则,如果您需要的话,有几种不同的方法可以更接近套接字级别。

TCP客户端/UDP客户端

它们在底层套接字周围提供了一个相对较薄的包装。它本质上是通过套接字提供一个流。您可以在 NetworkStream 上使用异步方法(BeginRead 等)。我不喜欢这个,因为包装器不能提供那么多,而且它往往比直接使用套接字更尴尬。

插座 - 选择

这提供了经典的 Select 技术,用于将多个套接字 IO 复用到单个线程上。不再推荐了。

插座 - APM 型

套接字的异步编程模型(又名 IAsyncResult,开始/结束样式)是异步使用套接字的主要技术。并且有几种变体。本质上,您调用异步方法(例如 BeginReceive)并执行以下操作之一:

  1. 轮询返回的 IAsyncResult 是否完成(几乎不使用)。
  2. 使用 IAsyncResult 中的 WaitHandle 等待方法完成。
  3. 向 BeginXXX 方法传递一个回调方法,该方法将在该方法完成时执行。

最好的方法是#3,因为它通常是最方便的。如有疑问,请使用此方法。

一些链接:

  • MSDN 杂志上有关套接字的文章 http://msdn.microsoft.com/en-us/magazine/cc300760.aspx
  • Jeffery Richter 关于异步编程模型的文章 http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

.NET 3.5 高性能套接字

.NET 3.5 引入了一种使用事件的异步套接字的新模型。它使用“简化的”异步模型(例如 Socket.SendAsync)。您无需提供回调,而是订阅事件以完成操作,并且获得 SocketAsyncEventArgs,而不是 IAsyncResult。这个想法是您可以重用 SocketAsyncEventArgs 并为套接字 IO 预分配内存。在高性能场景中,这比使用 APM 风格要高效得多。此外,如果您预先分配内存,您将获得稳定的内存占用、减少垃圾收集、固定造成的内存漏洞等。请注意,只有在最高性能的情况下才应考虑担心这一点。

  • MSDN 杂志:接触 .NET Framework 3.5 http://msdn.microsoft.com/en-us/magazine/cc163356.aspx
  • MSDN 信息与预分配内存技术 http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

Summary

大多数情况下使用 APM 风格的回调方法,除非您更喜欢 SocketAsyncEventArgs / Async 方法的风格。如果您在 WinSock 中使用过 CompletionPorts,您应该知道这两种方法在幕后都使用 CompletionPorts。

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

.net/C# 中的网络 的相关文章

  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何使用 C++11 using 语法键入定义函数指针?

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

随机推荐

  • 模拟安全警报的解决方案 - X509TrustManager 的不安全实现

    因此 最近我在开发人员控制台中收到以下警告 为了解决该问题 我已完成了所需的修复 根据谷歌的建议 here https support google com faqs answer 6346016 要确认您已进行正确的更改 请将应用程序的更
  • CouchDB 备份和克隆数据库

    我们正在寻找 CouchdDB 作为类似 CMS 的应用程序 围绕备份我们的生产数据库有哪些常见模式 最佳实践和工作流程建议 我对克隆数据库以用于开发和测试的过程特别感兴趣 仅从实时运行的实例下复制磁盘上的文件就足够了吗 您可以在两个实时运
  • TabLayout 使用自定义视图更新选项卡内容

    我在用着TabLayout新的材料设计 我有一个问题 创建选项卡后我无法更新自定义视图的选项卡内容 我可以用以下方法简化 PagerAdapter 中的方法 public View setTabView int position boole
  • 记录器服务错误:鼠标左键按下:无法找到匹配的元素 - Xcode 错误

    我正在尝试通过 XCTest 自动化我的 mac 应用程序 当尝试从 XCode 记录应用程序时 我收到以下错误消息 当我点击按钮时会发生这种情况 按钮层次结构是 按钮 gt 堆栈视图 gt NSView 这里 button是NSButto
  • 外键和索引问题

    我正在使用 SQL Server 2008 Enterprise 我有一个表 其中一个列引用另一个表 在同一个数据库中 中的另一列作为外键 这是相关的SQL语句 更详细地说 表 Foo 中的列 AnotherID 引用了另一个表表 Goo
  • 如何使用 sass 正确避免在 HTML 上嵌入 twitter bootstrap 类名

    我正在开发一个刚刚开始的 Rails 项目 我们想使用 twitter bootstrap 作为我们样式的基础 一开始我们只是直接在 HTML 代码上使用 bootstrap 的类名 就像 bootstrap 的文档中所示 但在阅读以下文章
  • 如何检查 Python 数组中是否存在某个元素(相当于 PHP in_array)?

    我是 Python 新手 我正在寻找一个标准函数来告诉我数组中是否存在某个元素 我找到了index方法 但如果未找到该元素 则会抛出异常 我只需要一些可以返回的简单函数true如果该元素在数组中或者false if not 基本上相当于 P
  • hook_user():将额外的字段插入数据库而不仅仅是表单

    我可以在注册中添加一个额外的字段 我需要知道的是我需要采取什么步骤来获取该输入并将其插入到 drupal 的用户表中 下面的代码位于我的模块中 它仅向表单添加一个字段 但是当提交时 它不会对数据执行任何操作 function perscri
  • 如何组合两个索引不同的 pandas 系列?

    我尝试将两个不同索引的系列组合在一起 相同的行数 我试过pd concat s1 s2 axis 1 例如 s1 为 index s1 0 1 5 1 2 s2 是 index s2 a 1 b 2 但我得到 index s1 s2 0 1
  • 批量从文本文件中删除重复行

    是否可以从文本文件中删除重复的行 如果是 怎么办 当然可以 但就像大多数批处理文本文件一样 它并不漂亮 而且不是特别快 该解决方案在查找重复项时忽略大小写 并对行进行排序 文件名作为第一个也是唯一一个参数传递给批处理脚本 echo off
  • 运行 jQuery 函数 onclick

    所以我实现了一些 jQuery 它基本上通过由滑块激活的滑块来切换内容 a 标签 现在考虑一下 我宁愿让保存链接的 DIV 本身就是链接 我正在使用的 jQuery 在我的脑海中看起来像这样 a
  • 用 jQuery 收集表单中的所有项目

    如何收集 jQuery 中的所有复选框和下拉列表项进行保存 或者 对于最新版本的 jquery 您可以使用 http docs jquery com Ajax serialize http docs jquery com Ajax seri
  • 如何解决DEP6500和DEP6701错误?

    我有一个项目叫BTLE在它自己的解决方案中 加载项目并使用手机上的调试器运行它可以找到 我有第二个解决方案 可以很好地加载和编译 我添加了BTLE项目 添加 现有项目 到第二个解决方案 编译它并尝试在调试器中运行它 我可以看到应用程序已正确
  • 使用 PIG 从 Hive 表解析嵌套 XML 字符串

    我正在尝试使用 PIG 从 Hive 表中的字段而不是从 XML 文件中提取一些 XML 这是我读过的大多数示例的假设 XML 来自排列如下的表 ID XML string XML 字符串包含 n 行 始终包含最多 10 个属性中的至少一个
  • 如何在 Python 中写入原始二进制数据?

    我有一个 Python 程序 可以存储数据并将数据写入文件 数据是原始二进制数据 内部存储为str 我正在通过 utf 8 编解码器将其写出来 但是 我得到UnicodeDecodeError charmap codec can t dec
  • 使用 ASP.Net 2.0 创建 SOAP 请求

    我正在与服务器网站的技术联系人交谈 他希望我使用 Visual Studio 而我只想手写脚本 请参阅下文了解我需要生成的 SOAP 请求 我已将实际 URL 替换为虚拟 URL 正如您可能猜到的那样 我对 ASP 和 SOAP 还很陌生
  • Wagtail 文档:大文件(>2GB)上传失败

    我正在尝试使用 Wagtail 应用程序中内置的 wagtaildocs 应用程序上传文件 我已经使用 Nginx 的 Digital Ocean 教程方法设置了 Ubuntu 16 04 服务器 鳐鱼 Postgres 一些初步澄清 在我
  • 包签名与之前安装的版本不匹配

    这是我的项目 https github com kenpeter my hak news https github com kenpeter my hak news 它是直接复制https github com grigio HAgnost
  • Google Map API V3.0 - 如何检测 MapTypeId 更改

    要添加侦听器来检测缩放更改 请执行以下操作 google maps event addListener map zoom changed function 检测地图类型变化的代码是什么ROADMAP到另一个视图 例如SATELLITE 我可
  • .net/C# 中的网络

    有人可以为我指明学习如何在 C net 3 5 中进行网络连接的正确方向吗 欢迎提供代码示例和解释 基本上我正在寻找如何进行异步 多线程服务器 客户端模型 我对如何使用 WinSock 在 C 中实现这一点的基础知识相当满意 但尽管我所有的