C# 使用 SocketAsyncEventArgs 实现UdpSocket系列

.NET Framework 2.0SP1及以后版本提供了一组用于网络通信的增强功能类库,SocketAsyncEventArgs 就是其中最重要的一个,下面是MSDN对这组增强功能的类库的介绍。

    System.Net.Sockets.Socket 类有一组增强功能,提供可供专用的高性能套接字应用程序使用的可选异步模式,SocketAsyncEventArgs 类就是这一组增强功能的一部分。该类专为需要高性能的网络服务器应用程序而设计。应用程序可以完全使用增强的异步模式,也可以仅仅在目标热点区域(例如,在接收大量数据时)使用此模式。

        这些增强功能的主要特点是可以避免在异步套接字 I/O 量非常大时发生重复的对象分配和同步。当前由 System.Net.Sockets.Socket 类实现的开始/结束设计模式要求为每个异步套接字操作分配一个 System.IAsyncResult 对象。

在新的 System.Net.Sockets.Socket 类增强功能中,异步套接字操作由分配的可重用 SocketAsyncEventArgs 对象描述并由应用程序维护。高性能套接字应用程序非常清楚地知道必须保持的重叠的套接字操作的量。应用程序可以根据需要创建任意多的 SocketAsyncEventArgs 对象。例如,如果服务器应用程序需要总是有 15 个未完成的套接字接收操作来支持传入客户端连接率,那么可以为此分配 15 个可重用的 SocketAsyncEventArgs 对象。

使用此类执行异步套接字操作的模式包含以下步骤:

  1. 1.         分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。
  1. 2.         将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最大数据量)。
  1. 3.         调用适当的套接字方法 (xxxAsync) 以启动异步操作。
  1. 4.         如果异步套接字方法 (xxxAsync) 返回 true,则在回调中查询上下文属性来获取完成状态。
  1. 5.         如果异步套接字方法 (xxxAsync) 返回 false,则说明操作是同步完成的。可以查询上下文属性来获取操作结果。
  1. 6.         将该上下文重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。

新的异步套接字操作上下文对象的生命周期由应用程序代码引用和异步 I/O 引用决定。在对异步套接字操作上下文对象的引用作为一个参数提交给某个异步套接字操作方法之后,应用程序不必保留该引用。它将在完成回调返回之前一直保持引用。但是,应用程序保留对上下文的引用是有好处的,这样该引用就可以重用于将来的异步套接字操作。

MSDN 也提供了一个简单的使用 SocketAsyncEventArgs TCP 通信示例,从示例可以了解 SocketAsyncEventArgs 使用的基本方法。本系列文章将介绍如何使用 SocketAsyncEventArgs 进行 UDP 通信,最终将实现一个类似与 UdpClient 类功能的 UdpSocket 组件,本系列文章初步分文以下几部分:

1、  基于UdpSocket的通通信示例,服务端和客户端。

2、  UdpSocket 缓冲区 BufferManager 介绍

3、  UdpSocket SocketAsyncEventArgs 缓存池的实现

4、  UdpSocket 实现介绍

目的是通过上面几部分的介绍,学习:

1、  当需要申请大量的内存空间的时候,如何设计和使用缓冲区。

2、  当需要不停的实例化和销毁一个对象,如何设计和使用缓存池(WeakReference的使用)。

3、  了解 SocketAsyncEventArgs 的使用。

原文地址:https://www.cnblogs.com/zwq194/p/2746393.html