Socket IOCP通讯【转】

Windows高效通信模型之IOCP 今晚复习计网去了...然后思考了一下怎么解决今天下午那份代码,客户端被子线程阻塞的问题。就像之前说的,那份代码是“One-thread-per-client“的模型,对每个是客户端的连接请求,都要临时创建一个socket来处理,这样就造成了系统开销比较大的问题,而且线程之间的互相阻塞也是影响效率的重要原因。 于是上网找了一下相关的信息,发现Windows下有一种号称性能最好的通信模型,叫做IOC 阅读详情
SocketAsyncEventArgs是.net提供的关于异步socket类,封装了IOCP的使用,可以用它方便的实现NIO(non-blocking IO)

NIO对于提升某些场景下Server性能和吞吐量有很大益处,准备在服务框架中使用它来编写简易rpc的部分

微软官方的demo代理有所缺少:

http://msdn.microsoft.com/en-us/ ... asynceventargs.aspx

还有篇老外写的补充了缺少的代码:

http://www.codeproject.com/KB/IP/socketasynceventargssampl.aspx

不过例子还是感觉复杂了点,我只是需要知道SocketAsyncEventArgs本身如何使用而已,于是自行简化了一下:
1:  using System;  
2:  using System.Net;  
3:  using System.Net.Sockets;  
4:  using System.Text;  
5:    
6:  namespace SocketAsyncServer  
7:  {  
8:      public static class Program  
9:      {  
10:          public static void Main(String[] args)  
11:          {  
12:              IPAddress[] addressList = Dns.GetHostEntry(Environment.MachineName).AddressList;  
13:              new TcpListener().Listen(new IPEndPoint(addressList[addressList.Length - 1], 9900));  
14:    
15:              Console.ReadKey();  
16:          }  
17:      }  
18:    
19:      public class TcpListener  
20:      {  
21:          private SocketAsyncEventArgs Args;
22:          private Socket ListenerSocket;  
23:          private StringBuilder buffers;  
24:          public TcpListener() { }  
25:          public void Listen(EndPoint e)  
26:          {  
27:              //buffer  
28:              buffers = new StringBuilder();  
29:              //socket  
30:              ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
31:              ListenerSocket.Bind(e);  
32:              ListenerSocket.Listen(10);  
33:              //异步socket事件  
34:              Args = new SocketAsyncEventArgs();  
35:              Args.Completed += new EventHandler<SocketAsyncEventArgs>(ProcessAccept);  
36:              BeginAccept(Args);  
37:              Console.WriteLine("server run at {0}", e.ToString());  
38:          }  
39:    
40:          //开始接受  
41:          void BeginAccept(SocketAsyncEventArgs e)  
42:          {  
43:              e.AcceptSocket = null;
44:              if (!ListenerSocket.AcceptAsync(e))  
45:                  ProcessAccept(ListenerSocket, e);  
46:          }  
47:          //接受完毕 开始接收和发送  
48:          void ProcessAccept(object sender, SocketAsyncEventArgs e)  
49:          {  
50:              Socket s = e.AcceptSocket;  
51:              e.AcceptSocket = null;  
52:    
53:              int bufferSize = 10;//1000 * 1024;  
54:              var args = new SocketAsyncEventArgs();  
55:              args.Completed += new EventHandler<SocketAsyncEventArgs>(OnIOCompleted);  
56:              args.SetBuffer(new byte[bufferSize], 0, bufferSize);  
57:              args.AcceptSocket = s;  
58:              if (!s.ReceiveAsync(args))  
59:                  this.ProcessReceive(args);  
60:    
61:              BeginAccept(e);  
62:          }  
63:    
64:          //IOCP回调  
65:          void OnIOCompleted(object sender, SocketAsyncEventArgs e)  
66:          {  
67:              switch (e.LastOperation)  
68:              {  
69:                  case SocketAsyncOperation.Receive:  
70:                      this.ProcessReceive(e);  
71:                      break;  
72:                  case SocketAsyncOperation.Send:  
73:                      this.ProcessSend(e);  
74:                      break;  
75:                  default:  
76:                      throw new ArgumentException("The last operation completed on the socket was not a receive or send");  
77:              }  
78:          }  
79:            
80:          //接收完毕  
81:          void ProcessReceive(SocketAsyncEventArgs e)  
82:          {  
83:              if (e.BytesTransferred > 0)  
84:              {  
85:                  if (e.SocketError == SocketError.Success)  
86:                  {  
87:                      //读取  
88:                      var data=Encoding.ASCII.GetString(e.Buffer, e.Offset, e.BytesTransferred);  
89:                      buffers.Append(data);  
90:                      Console.WriteLine("Received:{0}", data);  
91:    
92:                      if (e.AcceptSocket.Available == 0)  
93:                      {  
94:                          //读取完毕  
95:                          Console.WriteLine("Receive Complete.Data:{0}", buffers.ToString());  
96:                          //重置  
97:                          buffers = new StringBuilder();  
98:                          //发送反馈  
99:                          Byte[] sendBuffer = Encoding.ASCII.GetBytes("result from server");
100:                          e.SetBuffer(sendBuffer, 0, sendBuffer.Length);
101:                          if (!e.AcceptSocket.SendAsync(e))
102:                          {
103:                      
104:                              this.ProcessSend(e);
105:                          }
106:                      }
107:                      else if (!e.AcceptSocket.ReceiveAsync(e))
108:                      {
109:                          this.ProcessReceive(e);
110:                      }
111:                  }
112:                  else
113:                  {
114:                      //this.ProcessError(e);
115:                  }
116:              }
117:              else
118:              {
119:                  //this.CloseClientSocket(e);
120:              }
121:          }
122:          //发送完毕
123:          void ProcessSend(SocketAsyncEventArgs e)
124:          {
125:              if (e.SocketError == SocketError.Success)
126:              {
127:    
128:                  if (!e.AcceptSocket.ReceiveAsync(e))
129:                  {
130:                      this.ProcessReceive(e);
131:                  }
132:              }
133:              else
134:              {
135:    
136:              }
137:          }
138:      }
139:        
140:  }


上述代码run起来之后,打开cmd用telnet测试下即可

telnet 127.0.0.1 9900
顺便推荐一下一个框架实现了nio的rpc

http://shuttler.codeplex.com/

http://www.cnblogs.com/overred/a ... Shuttler_Net_2.html
异步通信之IOCP详解 一、 概述 学习完网络基础,在写C/S应用程序时,大多童靴写服务器基本都没有用到io模型,基本都是采用“accept同步拥塞通讯和多线程方式”与客户端通讯。但当有成千上万客户端请求连接并与服务器通讯时,多线程的创建与CPU上下文的切换,服务器端压力可想而知,在资源有限的情况在,选择一个好的io模型才能搭建高性能服务器。其中IOCP广泛运用于个高性能服务器程序,apache服务器就是IOCP实现。 同步通讯和异步通信 在写网络程序时,我们知道CPU运行速度非常快,而在与IO设备进行数据交换时速度简直不忍直视。 阅读详情

相关推荐

C# Socket高并发

C#高性能大容量SOCKET并发(转) C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 C#高性能大容量SOCKET并发(三):接收、发送 C#高性能大容量SOCKET并发(四):缓存设计 C#高性能大容量SOCKET并发...

ishenjiaming的博客 2897

IOCP完成端口与长连接通讯

        最近在写一个通讯代理程序的时候使用了IOCP通讯模型,几年前也使用过IOCP,不过当时的程序是基于短连接的,而这次是长连接的,写这个程序的过程中我觉得主要有以下几点值得注意:1、整个程序的架构:程序由一个Accept线程,n个工作者线程,1个线程池管理线程,n个业务处理线程构成。Accept线程接收客户端连接并投递WSARecv重叠操作,工作者线程中通过GetQueuedCom

Mckay的专栏 4511

C#高性能Socket并发IOCP实战示例

是IOCP模型中事件处理的核心函数,负责从完成队列中获取I/O完成事件,并驱动异步I/O操作的后续处理。通过深入理解其参数、调用流程、事件判断逻辑及多线程环境下的同步问题,开发者可以构建出稳定、高效的网络服务框架。下一章将介绍如何创建和管理线程池,以配合IOCP模型实现更高级的并发控制与任务调度。

weixin_36047538的博客 1101

IOCP技术详解

这几周我接触了Windows网络通讯中的IOCP模型,自己在网上找了相关的知识进行学习,自己又下了好多服务器端的代码,但都运行不了,也是自己菜,能力还需加强。幸好我师父资助了我一个能运行的服务端IOCP代码,自己参照网上的相关知识后又与这个能运行的代码做了参照,算是勉强理解了构造IOCP的一般方法,对IOCP的使用也有了很大的心得。接下来我就把自己对IOCP相关知识的理解记录下来,方便自己以后的复习,当然这篇文章如果对正在阅读的你有帮助也算是很好的。...

StarWang的博客 5799

银河麒麟系统下VSCode安装全攻略:从下载到桌面快捷方式(附常见问题解决)

本文详细介绍了在银河麒麟系统下安装和优化VSCode的全流程,包括环境准备、安装策略、权限管理、桌面快捷方式创建以及系统级性能调优。特别针对国产系统环境提供了常见问题解决方案和必备插件推荐,帮助开发者高效配置开发环境。

v6b7n8m9q0的博客 1135

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

功能强大的IOCP Socket Server模块源码——完成端口通讯服务器(IOCP Socket Server)设计(六)

完成端口通讯服务器(IOCP Socket Server)设计(六)功能强大的IOCP Socket Servre模块例程源码Copyright © 2009 代码客(卢益贵)版权所有QQ:48092788   源码博客:http://blog.youkuaiyun.com/guestcode 本文论坛讨论:http://topic.youkuaiyun.com/u/20090921/11/69fe462

码客 卢益贵 ygluu 1万+

【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用

本文首先介绍了卫星轨道的六根数参数:半长轴 a、偏心率 e、轨道倾角 i、升交点赤经 Ω、近地点幅角 ω 以及真近点角 ν,并探讨了如何利用这些参数计算卫星与地面终端之间的距离、相对速度及由此产生的多普勒频移。利用开普勒运动公式计算当前瞬间的轨道半径;根据真近点角 ν 在围心坐标系中计算位置矢量和速度矢量;利用旋转矩阵(依次旋转 ω、i、Ω)将围心坐标系的状态矢量转换到地心惯性坐标系;最终结合地面终端信息,计算卫星与终端的欧氏距离、沿视线的相对速度及多普勒频移。

u011376987的博客 9500

高性能的socket通讯服务器(完成端口模型--IOCP)

关键词:delphi socket通讯服务器例程(完成端口模型--IOCP)、I/O Completion Port、socket通讯登峰造极、IO重叠、 IOCP客户服务端         高性能的socket通讯服务器(完成端口模型--IOCP)       很多人费尽心思,都没有找到一个完美的 I/O CP 例程,甚至跟人于误解,先将本人编写的例程

码客 卢益贵 ygluu 1万+

晶体管的 栅极gate 材料选用 多晶硅polysilicon,并采用 自对准工艺 self-aligned IC后端版图 【VLSI】

本文为了解决为什么要使用多晶硅作栅极触点的问题,先介绍了MOS管的工作原理是通过栅极上所加的电压控制漏极与源极之间电流,然后解释了栅极的材料为什么选用多晶硅,然后介绍了晶体管里栅极的自对准工艺(Self-Aligned Gate )。

Jie_MSD的博客 1万+

Cisco 路由器 打环测试教程

环 回测试是很常用的一种测试,通常用于检查和分析端口或线路问题。如下图所示,我们在设备端口上用命令loopback(某些端口上命令格式为 loopback diagnostic)使接口从内部将自己发送的信号转接到自己的接收端(如红线所示),通过检查数据发送和接收的情况来判断端口工作状态是否正常。如果 需要对端口进行完全的检测,可以使用符合标准的短跳线将端口收发短接构成环...

weixin_34304013的博客 2024

IOCP

iocp是windows上通讯模型,把socket的阻塞函数,如recv改成完成端口的来完成. 基本的思路,创建一个线程池来作为工作者线程,然后线程的处理函数是接收/转发数据. server /* 所用到的函数: HANDLE WINAPI CreateIoCompletionPort( __in HANDLE FileHandle, // 已经打开的文件句柄或者空句柄,一般是...

zylg 577

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能

基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

是谁神化了IOCP——完成端口通讯服务器(IOCP Socket Server)设计(1)

完成端口通讯服务器(IOCP Socket Server)设计(一)是谁神化了IOCPCopyright © 2009 代码客(卢益贵)版权所有QQ:48092788   源码博客:http://blog.youkuaiyun.com/guestcodeWindows系统下的socket模型有多种,其中完成例程的效率也是相当高的,其它的也不差(相关模型知识这里不多做介绍,读者可以自己搜

码客 卢益贵 ygluu 8220

端侧 AI 落地避坑指南(中):为什么 QAT 救不了精度?——对齐“融合后算子“的硬件物理约束

在上一篇文章中,我们深入探讨了量化的本质,并得出结论:QAT(量化感知训练)是保持精度的关键。明明做了 QAT,精度还是崩塌了!让我们看一个真实的案例:✅ 使用了✅ 配置了量化✅ 训练了 50 个 epoch,学习率降为原来的 1/10✅ 冻结了 BN 统计量FP32 模型:mAP = 0.85QAT 后 FP32:mAP = 0.84(正常)工具量化后:mAP = 0.68(崩塌!问题出在哪里?层融合(Layer Fusion)机制。

weixin_51988935的博客 55

特殊通信领域场景应用:基于Simulink的数字预失真(DPD)算法仿真建模示例

增益压缩:高功率输入时输出信号的增益下降。相位失真:输入信号的相位随功率变化而改变。带外干扰:非线性失真会引入额外的频谱分量,影响邻道信号。多项式模型:用多项式拟合功率放大器的非线性特性。查找表(LUT):通过离线训练生成预失真映射表。自适应算法:实时调整预失真参数以动态补偿失真。发送端:生成随机比特流并调制为射频信号。预失真模块:对输入信号进行预失真处理。功率放大器模块:模拟非线性失真。接收端:解调信号并评估误码率(BER)。

xiaoheshang_123的博客 274

一个简单而又灵活的IOCP模块——完成端口通讯服务器(IOCP Socket Server)设计(四)

 完成端口通讯服务器(IOCP Socket Server)设计(四)一个简单而又灵活的IOCP模块Copyright © 2009 代码客(卢益贵)版权所有QQ:48092788   源码博客:http://blog.youkuaiyun.com/guestcode 本文对部分IOCP不再多做重复的说明,阅读本文应该对IOCP有一定的了解(本篇也并未包括异步socket)。 

码客 卢益贵 ygluu 7032

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++线程池结合IOCP完成端口实现socket高并发服务端程序:提升网络服务性能的利器

C++线程池结合IOCP完成端口实现socket高并发服务端程序:提升网络服务性能的利器 去发现同类优质开源项目:https://gitcode.com/ 在当今互联网时代,网络服务端的高性能和稳定性至关重要。本文将详细介绍一个开源项目——C++线程池结合IOCP完成端口实现socket高并发服务端程序,帮助开发者打造出高效、稳定的高并发网络服务。 项目介绍 C++线程池结合IOCP完成端口实现s...

gitblog_06703的博客 1077

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IOCP 网络通讯模型源码解读

From: http://hi.baidu.com/tsingsing/item/1aa5062fa27791fa50fd87b7以前写服务器的时候用的是iocp,最近偶然发现windows的 网络通讯模型除了Iocp,还有好几种其他类型。这里总结下,感谢原贴作者。IOCP 网络通讯模型源码解读老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员...

weixin_34358092的博客 138

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++——iocp模型

IOCP有一个队列,当你要发数据时,收数据和连接时,都交由IOCP队列处理,不会与操作系统底层交互。  该函数实际用于两个明显有别的目的: 5.4.3 向IOCP队列投递接受连接的请求 5.4.4 检测队列,从队列中取出完成的请求 5.4.5 投递一个队列完成状态 6. 示例 服务端 客户端...

www_dong的博客 5668

python iocp_Windows之IOCP

IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的Windows API,它可以高效地将I/O事件通知给应用程序,类似于Linux中的Epoll,关于epoll可以参考1. 简介IOCP模型属于一种通讯模型,适用于Windows平台下高负载服务器的一个技术。在处理大量用户并发请求时,如果采用一个用户一个线程的方式那将造成CPU在这成千上万的线程间...

weixin_33945547的博客 859

Delphi 跨平台 Socket 通讯库

Delphi 跨平台 Socket 通讯库 免费开源的Delphi 跨平台 Socket 通讯库。 源码URL:https://github.com/winddriver/Delphi-Cross-Socket 作者: WiNDDRiVER(soulawing@gmail.com) ## 重要更新(2017.08.22)- 代码重构, 做了大量修改, 详见源码- 增加了几个新的 interface...

weixin_33725270的博客 461

用C++实现最基本的Socket通讯(一)

前言闲聊 冬去春来,想着今年定个小目标,逐步实现TCP和UDP的通讯连接,自定义通讯协议,几种I/O模型(阻塞,非阻塞,I/O多路复用,IOCP),当中会涉及到许多知识,就我目前的知识水平大概了解有多线程,线程锁,生产者消费者模式,观察者模式,Json序列化,心跳监听等。在此分类的文章我尽量使用面向对象的思想来写,因为本人也才接触服务器不久,希望在文中出现了错误,或是有一些更好的方法或建议,希望...

立于浮华之世,奏出天使之章 5422

C# Socket高性能 IOCP

C#实现Socket通讯有同步模式与异步模式,异步模式的效率比同步模式高。在异步模式中,SocketAsyncEventArgs 类提供了增强功能。 这些增强功能可以避免重复分配的和在大量异步套接字 I/O 内进行同步的对象。通过创建一个SocketAsyncEventArgsPool 池来提高客户端连接速率。

鸽子的专栏 8139
下一篇: ASP.NET Case Study: Lost session variables and appdomain recycles
sgchen
博客等级 码龄22年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值