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

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

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

有帮助吗?

解决方案

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

TCP客户端/UDP客户端

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

插座 - 选择

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

插座 - APM 型

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

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

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

一些链接:

.NET 3.5 高性能套接字

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

概括

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

其他提示

在.NET 3.5世界中,您一定要学习 Windows Communication Foundation - 用于网络的.NET框架。

有用的链接:

同步和异步操作(在WCF中)

您可以在StackOverflow浏览帖子上找到有用的WCF信息用WCF标记标记

这取决于你想要关注的内容。

如果您想专注于功能并将管道保留在框架中,请从Windows Communication Foundation开始。

如果您正在构建自己的管道,请使用 System.Net.Sockets.Socket 类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top