关于C#高性能Socket服务器SocketAsyncEventArgs的实现的一些疑问 1C

// This class creates a single large buffer which can be divided up
// and assigned to SocketAsyncEventArgs objects for use with each
// socket I/O operation.

// This enables bufffers to be easily reused and guards against
// fragmenting heap memory.
//
// The operations exposed on the BufferManager class are not thread safe.
class BufferManager
{
int m_numBytes; // the total number of bytes controlled by the buffer pool
byte[] m_buffer; // the underlying byte array maintained by the Buffer Manager
Stack m_freeIndexPool; //
int m_currentIndex;
int m_bufferSize;

public BufferManager(int totalBytes, int bufferSize)
{
    m_numBytes = totalBytes;
    m_currentIndex = 0;
    m_bufferSize = bufferSize;
    m_freeIndexPool = new Stack<int>();
}

// Allocates buffer space used by the buffer pool
public void InitBuffer()
{
    // create one big large buffer and divide that 
    // out to each SocketAsyncEventArg object
    m_buffer = new byte[m_numBytes];
}

// Assigns a buffer from the buffer pool to the 
// specified SocketAsyncEventArgs object
//
// <returns>true if the buffer was successfully set, else false</returns>
public bool SetBuffer(SocketAsyncEventArgs args)
{

    if (m_freeIndexPool.Count > 0)
    {
        args.SetBuffer(m_buffer, m_freeIndexPool.Pop(), m_bufferSize);
    }
    else
    {
        if ((m_numBytes - m_bufferSize) < m_currentIndex)
        {
            return false;
        }
        args.SetBuffer(m_buffer, m_currentIndex, m_bufferSize);
        m_currentIndex += m_bufferSize;
    }
    return true;
}

// Removes the buffer from a SocketAsyncEventArg object.  
// This frees the buffer back to the buffer pool
public void FreeBuffer(SocketAsyncEventArgs args)
{
    m_freeIndexPool.Push(args.Offset);
    args.SetBuffer(null, 0, 0);
}

}

上面是MSDN官网给出的案例,在BufferManager类中有一个变量是 m_freeIndexPool,我看了很久这一段代码始终搞不明白这个变量存储的int集合代表的是什么意义,并且为什么在SetBuffer(SocketAsyncEventArgs args)方法中,m_freeIndexPool.Count > 0 就可以把接收到的数据放入m_buffer中?
MSDN官网:https://msdn.microsoft.com/zh-cn/library/bb517542.aspx

0

1个回答

有大牛帮忙给解释一下吗?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 高性能服务器 - 端口-心跳高性能Socket服务器
C# 高性能服务器 - 端口-心跳高性能Socket服务器 为啥不能设置免费分了呢 最低的都要两分
C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)
    想着当初到处找不到相关资料来实现.net的Socket通信的痛苦与心酸, 于是将自己写的代码公布给大家, 让大家少走点弯路, 以供参考. 若是觉得文中的思路有哪里不正确的地方, 欢迎大家指正, 共同进步.      说到Socket通信, 必须要有个服务端, 打开一个端口进行监听(废话!) 可能大家都会把socket.Accept方法放在一个while(true)的循环里, 当然也没...
C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (客户端实现)
    上一篇讲了服务器端的实现, 这一篇就是客户端的实现.     服务器实现参考:《C#如何利用SocketAsyncEventArgs实现高效能TCPSocket通信 (服务器实现)》      与服务器不同的是客户端的实现需要多个SocketAsyncEventArgs共同协作,至少需要两个:接收的只需要一个,发送的需要一个,也可以多个,这在多线程中尤为重要,接下来说明。   ...
C#Socket异步服务器 IOCP 源码
c#基于SocketAsyncEventArgs的异步socket服务器,是IOCP完成端口实现的 c#基于SocketAsyncEventArgs的异步socket服务器,是IOCP完成端口实现的
C++ IOCP socket完成端口视频教程及源码
C++SOCKET IOCP高并发服务器引擎架构与实现视频教程及源码,需要有SOCKET编程基础,简单架构实现通俗易懂。
C#高性能大容量SOCKET并发完成端口例子IOCPDemo_NET_V4
C#高性能大容量SOCKET并发完成端口例子IOCPDemo_NET_V4
C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式,相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。服务端用C#编写,并使用log4net作为日志模块; 同时支持65536个连接,网络吞吐量可以达到400M。
C#实现Socket高性能、大容量并发(附完整实例源码)
C#实现Socket高性能、大容量并发(附完整实例源码),可以先运行文件看代码。
完整的IOCP模型 Echo服务器及代码分析
首先,先感谢http://www.cnblogs.com/talenth/p/7068392.html 这篇博文,作者写的通俗易懂,语言幽默,偶然一次在公交车上见到这篇博文相见恨晚,一口气读下来很长一篇,有了整体的认知,又翻看代码,查看其它资料,反复研究每个细节,终于IOCP模型基本懂了,下面给出一些心得。建议先看一遍上面提及的博客,再看这篇文章,应该会很快就能理解。 IOCP模型也称完成端口,...
C#高性能大容量SOCKET并发
用在项目上了
C#高性能服务器;端口-心跳高性能Socket服务器
C#开发的高性能服务器+-+端口-心跳高性能Socket服务器; 完善的服务器并发处理机制,比较稳定。
自写C#高性能Socket服务器SocketAsyncEventArgs
项目用到服务器SocketAsyncEventArgs高并发,尽管百度上千姿百态,还是自己总结写了一个可以接入项目的高性能~~还有用于模拟客户端发送的工具tcpudptest,,更改IP跟端口号就行~~纪念下写了三个多月的通信~~
TCPIP服务器连接组件,快速开发高性能TCP服务器(C/S),socket异步连接并发高
简单几部就可以开发出高性能的C/S模式tcp服务器 演示源码里有数据报文重载势力,可以根据实际需求进行 不同数据格式的开发。 已经基于这个开发多个物联网相关实际应用 启动部分代码 //新建服务TcpSvr svr = new TcpSvr(6000, 50, new Coder(Coder.EncodingMothord.Unicode)); this.SetText("创建tcp服务成功,端口:6000"+" 最大连接数:50" +"\r\n"); //定义服务器的4个事件 //服务器满 svr.ServerFull += new NetEvent(ServerFull); //新客户端连接 svr.ClientConn += new NetEvent(ClientConn); //客户端关闭 svr.ClientClose += new NetEvent(ClientClose); //接收到数据 svr.RecvData += new NetEvent(RecvData); this.SetText("创建四个事件(服务器满、新客户端连接、客户端关闭、接收到数据)成功服务成功\r\n"); //添加报文拆包 svr.Resovlver = new MyDatagramResolver(); this.SetText("创建报文分析器成功\r\n"); svr.Start(); this.SetText("服务开启成功!!!\r\n");
C#高性能大容量SOCKET并发完成端口例子,带C#源码客户端及服务端
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议, 用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式, 相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。
稳定可靠的C# 高性能Socket网络服务端和客户端组件
稳定可靠的C# IOCP组件,加入底层心跳检测机制,支持批量发送多个数据包。单机服务端和客户端收发速率峰值达到50M bps。网络异常断线(服务端运行于虚拟机,然后禁用虚拟机网卡),超过心跳检测时间,能够自动关闭Socket. 客户端可作为服务器压力测试工具。
c# tcp 基于完成端口开发 高性能 高并发 吞吐量大 包含服务端 客户端完整代码 支持最大连接数支持65535个长连接
c# tcp 基于完成端口开发 高性能 高并发 吞吐量大 包含服务端 客户端完整代码 支持最大连接数支持65535个长连接
c# socket 高性能传送大文件
4G文件已通过测试。对学习很有帮助。共享给大家。 更新:http://download.csdn.net/source/2421757
c# socket IOCP
C# 基于SocketAsyncEventArgs,采用线程池,实现Socket IOCP,适合初学者。
基于IOCP的简单HTTP,与通用服务开发框架
基于IOCP的Socket封装(两个类,一个实现了点HTTP协议,一个原始的数据,方便扩展)
.Net调试内存泄漏不断增长小记——SocketAsyncEventArgs
现象用C#异步方式实现的网络底层协议,开发的服务器。上线运行一段时间后,发现一开始内存非常稳定,但是过了一定时间后,内存使用量会开始不停的上涨。直到内存耗尽。排查遇到这一问题可以明确的是内存发生了泄漏。由于.Net中,托管对象的内存是由垃圾回收机制负责回收的。所以存在内存增长的情况,往往不是因为没有释放。而是有几种原因 分配的内存,比垃圾回收的还要快 对象存在引用,没有办法被垃圾回收机制回收。 对于
高性能跨平台(Win&Linux;)网络通信框架 HP-Socket
高性能跨平台(Win&Linux;)网络通信框架 HP-Socket 没有最好只有更好, 非源代码,太大无法上传,有网址可自行下载完整包 。 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、PACK 模型示例、性能测试示例以及其它编程语言示例)。HP-Socket 目前支持 Windows 和 Linux 平台。 HP-Socket 的设计充分注重功能、通用型、易用性与伸缩性; HP-Socket 项目主页:http://www.oschina.net/p/hp-socket
大数据疑问总结
1.Storm与Flink怎样写出符合并发的程序?静态与动态,不变缓存的尽量加载一次; 2.封装与模块化思想?类与方法?示例,一次编写,到处运行(过滤港口和锚地代码); 3.对象序列化?storm与flink中的区别,各个-组件之间的序列化问题;【各个算子是否需要序列化,怎样避免序列化】 4.内存中怎样减少FullGC,对象复用; 5.Flink中初始化几次,开启并发的情况呢,放在A: prepa...
C#高性能大容量SOCKET并发完成端口例子(有C#客户端)
C#高性能大容量SOCKET并发完成端口例子(有C#客户端)
C# Tcp 全双工通信 实现
C# Tcp 全双工通信笔者在之前用到tcp时,一直都是收数据的时候不发,发数据的时候不收,这是半双工通信。可是大家都知道tcp是可以全双工通信的。所以今天笔者就尝试了一下,嗯,确实可以的而且很简单。主要思路是用多线程来解决。对于同一个socket,开2个线程,一个线程用来处理发送数据,一个线程用来处理接收数据,就ok了。笔者写了个小程序来验证,非常简单的界面,用到两个tcpclient,分工如下:
c# socket client
c# socket 异步socketAsyncEventArgs效率问题
c# socket server
c# socket 异步socketAsyncEventArgs效率问题
一、DEMO c# socket 连接服务器(客户端代码)
using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using System.Net;using System.Diagnostics; namespace SocketClient{    class Program    {        static Socket c...
C#高性能大容量SOCKET并发完成端口例子完整实例源码
C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码
C#高效率SOCKET并发端口例子
这是从网上下载的C#高效率SOCKET并发端口的例子,有需要的朋友可以看一下
c# TCP高性能通信
开篇都是吹牛逼哈。。。 我原本打算使用dotnetty来解决传输问题,但是试了下没有成功,也没有找到相关问题解决方法,导出源码,好大啊。暂时不想研究,而且是.Net Core的。最后没有办法,就自己封装了。我就不上代码了,已经传到GIT上面了,和其它项目。 我主要介绍过程原理,; 1.ISocketChannel接口,继承实现通信,继承类封装Socket. 2.外层封装ServerSock...
.net使用的高性能大吞吐量socket
.net使用的高性能大吞吐量socket
SocketAsyncServer3.5
高性能异步SOCKET服务器端 public class TcpListener { private SocketAsyncEventArgs Args; private Socket ListenerSocket; private StringBuilder buffers; public TcpListener() { } public void Listen(EndPoint e) { //buffer buffers = new StringBuilder(); //socket ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ListenerSocket.Bind(e); ListenerSocket.Listen(10); //异步socket事件 Args = new SocketAsyncEventArgs(); Args.Completed += new EventHandler<SocketAsyncEventArgs>(ProcessAccept); BeginAccept(Args); Console.WriteLine("server run at {0}", e.ToString()); } //开始接受 void BeginAccept(SocketAsyncEventArgs e) { e.AcceptSocket = null; if (!ListenerSocket.AcceptAsync(e)) ProcessAccept(ListenerSocket, e); } //接受完毕 开始接收和发送 void ProcessAccept(object sender, SocketAsyncEventArgs e) {
C# Socket 客户端服务端封装 支持多连接处理 Tasks多线程 队列处理 大数据拆分包处理
Socket 客户端代码封装、服务端代码封装,让使用Socket更简单。 同时服务端支持超过客户端连接(测试超过1万个同时连接稳定运行),Tasks多线程 队列处理 大数据拆分包处理
c++使用完成端口实现服务器的高性能并发
如何使用c++,借助完成端口完成大并发服务器的搭建,是今天要讨论的问题,套路如下: 套路总结一下: 创建完成端口 依据CPU核数创建一定数量的线程 线程中不断调用GetQueuedCompletionStatus检查完成端口状态,分别给予处理 创建一个socket,绑定IP和端口 将这个socket绑定到第一步创建的完成端口上 获取当前服务器的CPU核数,根据...
IOCP(Delphi NET)C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码修改版
修改StartAccept接收管理错误信息,否则在实际应用中会出现的错误
C#Winform异步Sokect加多线程编程实现客户端服务器端聊天模式
该Winform程序使用异步多线程+Sokect实现客户端和服务器端链接并进行互发消息
DELPHI高性能大容量SOCKET并发完成端口例子完整实例源码
Delphi高性能大容量SOCKET并发完成端口例子完整实例源码
基于Java的RDMA高性能通信库(二):Java Socket Over RDMA
  目录 1.Comparing JSOR with Java TCP communications 2.Comparing JSOR to Java Sockets Direct Protocol (SDP) communications 3.JSOR features and design 3.1 JSOR Desgin 3.2 JSOR Zero copy function 4...
端口重叠情况下Socket的创建与释放
就一个Socket完成传输后重建的问题,被坑了整整两天。 在这里简单记录 一下。 为了完成NET穿透,在客户端我们用 TCPClient 使用随机端口号,创建一个到服务器的连接,然后在相同的端口上,再新建一个Socket,并在这个Socket上打开侦听,等待网络上,特别是公网上的连接。 公网上的服务器,为了支持浏览器访问,是一个long-pulling类型的信息交换服务,同时支
TCPUDPServer.cs
C# 高性能服务器 - 端口-心跳高性能Socket服务器 源码分享