c# SocketAsyncEventArgs类的使用 IOCP服务器
要编写高性能的Socket服务器,为每个接收的Socket分配独立的处理线程的做法是不可取的,当连接数量很庞大时,服务器根本无法应付。要响应庞大的连接数量,需要使用IOCP(完成端口)来撤换并处理响应。
.net framework的System.Net.Sockets.Socket 类有一组xxxAsync方法是封装了IOCP的处理,用于编写高性能Socket应用程序,xxxAsync该组方法需要结合SocketAsyncEventArgs类来使用,下面是MSDN参考资料,里面有一个详细的例子:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx
Socket类xxxAsync的方法,使用起来比较复杂,需要时间消化上述的例子,结合实际编写所需的操作。
web服务器编程过程中。需要使用异步技术。使用异步的地方:
1、监听socket,需要等待客户端接入。这是需要一个线程专门负责监听(accept方法)
2、一旦客户端连接,通信socket需要线程监听缓冲区,以便与客户端通信。包括接收和发送。
写些自己的理解。
1、利用socket类中提供的异步方法:AcceptAsync。创建监听方法
这个方法需要在回调函数中重复调用,以保证监听。
private void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
if (acceptEventArg == null) //初始化用
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); //回调函数 实例化
}
else //循环调用时 需要清理对象。将AcceptSocket属性设置为null。等待新连接的接入
{
acceptEventArg.AcceptSocket = null;
}
bool bl = this.listenSocket.AcceptAsync(acceptEventArg); //该异步方法 每次只能接收一个连接。需要循环调用 if (!bl)
{
this.ProcessAccept(acceptEventArg);
}
}
回调函数(有格式哦)这个e变量包含了好多的东东哦。
private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("有一个客户端连接上来了");
StartAccept(e); //非常重要,循环调用该方法。实现监听
}
2、在回调函数中。利用socket类提供的异步方法:ReceiveAsync和SendAsync。异步接收和发送数据
c# SocketAsyncEventArgs类的使用 IOCP服务器的更多相关文章
- [转帖]译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
原文链接:http://norke.blog.163.com/blog/static/276572082011828104315941/ 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我 ...
- 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
转载自: http://blog.csdn.net/hulihui/article/details/3244520 原文:How to use the SocketAsyncEventArgs c ...
- C# IOCP服务器
C# IOCP服务器 @by 群63438968 这是我写的unity 网络斗地主的服务器源码,本来我想只公开部份服务端代码的,但是为了回报大家的热情,以及曾经和现在的好兄弟,我计划慢慢开源! 告诉 ...
- C# SocketAsyncEventArgs类
Namespace:System.Net.Sockets Assemblies:System.Net.Sockets.dll, System.dll, netstandard.dll (Represe ...
- 网络基础编程_5.4聊天室-IOCP服务器
聊天室-IOCP服务器 main 创建完成端口内核对象(CreateIoCompletionPort) 获取核心数并创建线程(GetSystemInfo + CreateThread) 创建套接字并绑 ...
- C# IOCP服务器项目(学习)
无论什么平台,编写支持高并发性的网络服务器,瓶颈往往出在I/O上,目前最高效的是采用Asynchronous I/O模型,Linux平台提供了epoll,Windows平台提供了I/O Complet ...
- 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
原创性申明 本文作者:小竹zz 博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...
- C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
网址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket ...
- (IOCP)-C#高性能Socket服务器的实现
C#高性能Socket服务器的实现(IOCP) https://www.jianshu.com/p/c65c0eb59f22 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Sock ...
随机推荐
- 信息增益(Information Gain)(转)
当我们需要对一个随机事件的概率分布进行预测时,我们的预测应当满足全部已知的条件,而对未知的情况不要做任何主观假设.在这种情况下,概率分布最均匀,预测的风险最小.因为这时概率分布的信息熵最大,所以称之为 ...
- jdb调试程序
1) jdb调试正在运行的进程: 先使用jps先确定进程号,然后让jdb连接上目标进程(23549换成实际的进程号): jdb -connect sun.jvm.hotspot.jdi.SAPIDAt ...
- How to Create a Framework for iOS[RE]
In the previous tutorial, you learned how to create a reusable knob control. However, it might not b ...
- EBS单实例上所有正在运行的并发请求以及请求目前的状态
--EBS单实例上所有正在运行的并发请求以及请求目前的状态---一个实例上运行的所有并发请求的总结和他们目前的状态以及等待状态 select w.seconds_in_wait "Se ...
- ViewPage实现无限轮播画廊效果
1. 效果图 2. 布局文件 主要使用的 android:clipChildren的意思:是否限制子View在其范围内.再父布局和viewpager中设置该属性 ,要显示三个界面 ,还要设置marg ...
- 使用Object.create()实现继承
一.常见继承方式 我们日常开发中常见的继承方式主要有: 1.默认模式: Child.prototype = new Parent(); 2.借用构造函数: function Child(a, b, c ...
- Mycat SqlServer Do not have slave connection to use, use master connection instead
Do not have slave connection to use, use master connection instead 很奇怪啊 都是按照配置配置的 怎么就是不通呢 有点怀疑人生了吧 其 ...
- Mounting VMDK files in Linux
1.用 loop 方式挂载 vmdk 文件 losetup /dev/loop0 docker_pull-flat.vmdk 2.查看分区 [root@localhost]# parted /dev/ ...
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...