高性能TcpServer(C#) - 1.网络通信协议

高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

高性能TcpServer(C#) - 3.命令通道(处理:掉包,粘包,垃圾包)

高性能TcpServer(C#) - 4.文件通道(处理:文件分包,支持断点续传)

高性能TcpServer(C#) - 5.客户端管理

高性能TcpServer(C#) - 6.代码下载

代码解析

SocketAsyncEventArgs对象管理 -- 用于CheckOut/CheckIn SocketAsyncEventArgs对象

SocketArgsPool socketArgsPool = new SocketArgsPool(MAX_CLIENTCOUNT);

this.m_EventArgs = this.m_socketArgsPool.CheckOut();// 初始化对象

this.m_bufferPool.CheckIn(m_EventArgs);// 回收对象

SocketArgsBufferPool对象管理 -- 用于CheckOut/CheckIn SocketAsyncEventArgs的Buffer

SocketArgsBufferPool bufferPool = new SocketArgsBufferPool(MAX_CLIENTCOUNT, MAX_CLIENTBUFFERSIZE);

this.m_bufferPool.CheckOut(this.m_EventArgs);// 设置setBuffer

this.m_bufferPool.CheckIn(m_EventArgs);// 回收对象

SocketEntityPool对象管理 -- 用于CheckOut/CheckIn SocketEntity

SocketEntityPool socketEntityPool = new SocketEntityPool(MAX_CLIENTCOUNT, MAX_CLIENTBUFFERSIZE);// 初始化

m_socketEntity = this.m_socketEntityPool.CheckOut();

m_socketEntity.SocketClient = socket;

m_bufferRecv = m_socketEntity.BufferRecv; m_bufferRecv.Clear();// 每个client的接收缓冲区

m_handle = m_socketEntity.ProtocolHandle;// 每个client的处理类

m_analysis = m_socketEntity.ProtocolAnalysis;// 每个client的解析类

this.m_socketEntityPool.CheckIn(socketEntity);// 回收对象

部分代码

服务器监听和接收客户端连接

public void Start(int port)

{

IPEndPoint ipEP = new IPEndPoint(IPAddress.Any, port);

this.m_listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

this.m_listenerSocket.Bind(ipEP);

this.m_listenerSocket.Listen(100);

ListenForConnection(m_listenerArgs);

}

void ListenForConnection(SocketAsyncEventArgs args)

{

lock (this)

{

args.AcceptSocket = null;

m_listenerSocket.InvokeAsyncMethod(new SocketAsyncMethod(m_listenerSocket.AcceptAsync), AcceptAsyncCompleted, args);

}

}

void AcceptAsyncCompleted(object sender, SocketAsyncEventArgs e)

{

if (e.SocketError == SocketError.OperationAborted)

{

CLogHelp.AppendLog("[Error] AcceptAsyncCompleted:SocketError.OperationAborted");

return; //Server was stopped

}

if (e.SocketError == SocketError.Success)

{

Socket acceptSocket = e.AcceptSocket;

if (acceptSocket != null)

{

if (connections + 1 <= MAX_CLIENTCOUNT)

{

IPEndPoint clientEP = (IPEndPoint)acceptSocket.RemoteEndPoint;

sn = String.Format("{0}:{1}", clientEP.Address.ToString(), clientEP.Port);

lock (LockIndex)

{

connections = Interlocked.Increment(ref connections);

Program.AddMessage("已连接,sn:" + sn + ",当前连接数:" + CServerIntance.connections.ToString());

}

CSocketDAO socketDao = new CSocketDAO(socketArgsPool, bufferPool, socketEntityPool, acceptSocket, sn);

CSingleton<CClientMgr>.GetInstance().AddOnlineClient(socketDao);

}

else

{

Program.AddMessage("超过最大连接数:" + MAX_CLIENTCOUNT.ToString() + ",拒接连接");

}

}

}

//continue to accept!

ListenForConnection(e);

}

服务器数据处理

void ReceiveAsyncCompleted(object sender, SocketAsyncEventArgs e)

{

if (!this.m_connected) return;

try

{

m_EventArgs = e;

if (m_EventArgs.BytesTransferred == 0)

{

SocketCatchError("BytesTransferred=0"); //Graceful disconnect

return;

}

if (m_EventArgs.SocketError != SocketError.Success)

{

SocketCatchError("SocketError=" + (e.SocketError).ToString()); //NOT graceful disconnect

return;

}

//数据存储

recvTime = DateTime.Now;

m_bufferRecv.Put(e);

m_analysis.BagStatus = CProtocolAnalysis.EBagStatus.BagNone;

// 粘包处理

while (m_bufferRecv.HasRemaining())

{

// 掉包处理

if (CProtocolAnalysis.EBagStatus.BagLost == m_analysis.BagStatus) break;

m_handle.Process(m_bufferRecv, m_analysis, m_strSn);// 数据解析(垃圾包处理)

if (string.IsNullOrEmpty(m_strUid))

{

if (!string.IsNullOrEmpty(m_analysis.Uid))

{

m_strUid = m_analysis.Uid;

CSingleton<CClientMgr>.GetInstance().AddClientUid(m_strUid, m_strSn, this);

}

}

if (m_analysis.WhetherToSend)

{

string data = CProtocolBase.GetProtocol(m_analysis);

SendRealTime(data);

}

}

ListenForData(e);

}

catch (Exception ex)

{

CLogHelp.AppendLog("[Error] ReceiveAsyncCompleted,errmsg:" + ex.Message);

}

}

高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)的更多相关文章

  1. 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...

  2. C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    网址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket ...

  3. 项目-高性能TcpServer - 目录

    1.项目-高性能TcpServer - 1.网络通信协议 https://blog.csdn.net/arno1988/article/details/82463225 2.项目-高性能TcpServ ...

  4. 高性能TcpServer(C#) - 1.网络通信协议

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  5. 高性能TcpServer(C#) - 3.命令通道(处理:掉包,粘包,垃圾包)

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  6. 高性能TcpServer(C#) - 4.文件通道(处理:文件分包,支持断点续传)

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  7. 高性能TcpServer(C#) - 5.客户端管理

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  8. 高性能TcpServer(C#) - 6.代码下载

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  9. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器

    第19章      RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

随机推荐

  1. python基础教程:dir()和__dict__属性的区别

    只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过- ---- __dict__和dir()来显示数据对象的相关属性. __ dict__可以看作是数据对象 ...

  2. LinuxShell脚本——变量和数据类型

    LinuxShell脚本——变量和数据类型 摘要:本文主要学习了Shell脚本中的变量和数据类型. 变量 定义变量的语法 定义变量时,变量名和变量值之间使用“=”分隔,并且等号两边不能有空格: 变量名 ...

  3. Java生鲜电商平台-订单架构实战

    Java生鲜电商平台-订单架构实战 生鲜电商中订单中心是一个电商后台系统的枢纽,在这订单这一环节上需要读取多个模块的数据和信息进行加工处理,并流向下一环节:因此订单模块对一电商系统来说,重要性不言而喻 ...

  4. JAVA 基础篇

    一.数组 1. 什么是数组? 数组和变量差不多,也是可以存放数据的,但是数组可以存放多个数据,而且多个数据的数据类型统一 格式 数据类型 [] 数组名称; 还有一种等效的写法,不推荐 数据类型 数组名 ...

  5. postgreSQL数据库的初探

    kali是黑客的强大武器,还有一个也是哦——Metasploit postgreSQL数据库是Metasploit的默认数据库哦! 启动postgresql: service postgresql s ...

  6. Dynamics 365 Customer Engagement中使用JavaScript和C#调用操作Action示例

    微软动态CRM专家罗勇 ,回复334或者20190509可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Action (操作)是流程的一种,可以在工作流中调用,可以使用 ...

  7. Python使用DB-API操作MySQL数据库

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库.与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要替 ...

  8. NetCoreAPI添加Swagger

    public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; ...

  9. Linux—主机扫描工具(Nmap)

    Nmap包含五项基本功能: 主机探测 (Host Discovery) 端口扫描 (Port Scanning) 版本检测 (Version Detection) 操作系统侦测 (Operating ...

  10. C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】

    1.可变参数(variable arguments): 可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数. int func(int, ... )             (函数 fun ...