.net/C 中的网络#

networking in .net/C#

提问人: 提问时间:10/17/2008 最后编辑:Joel Coehoorn 更新时间:10/17/2008 访问量:8569

问:

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

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

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

C# .NET 网络 异步

评论


答:

2赞 aku 10/17/2008 #1

在 .NET 3.5 世界中,您绝对应该学习 Windows Communication Foundation - 用于网络的 .NET 框架。

有用的链接:

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

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

0赞 Scott Weinstein 10/17/2008 #2

这取决于你想关注什么。

如果要将重点放在功能上,而将管道留给框架,则从 Windows Communication Foundation 开始。

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

16赞 denis phillips 10/17/2008 #3

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

TcpClient/UdpClient

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

套接字 - 选择

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

插座 - APM 型

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

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

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

一些链接:

.NET 3.5 高性能套接字.NET 3.5 High Performance Sockets

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

总结

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