[C#]I/O完成端口的实现

简介:
VC++ 中我几乎每一个 Windows Service 都是采用 I/O 完成端口。至于在 C# 中如何使用 I/O 完成端口,一直很少见人提及。  William Kennedy 的三篇文章《 IOCP Thread Pooling in C# 》,对实现这种机制很有帮助,唯一美中不足的是,它只能把 int 数值压入完成端口,而无法像 VC++ 中那样可以将接口指针 /BSTR 字符串等等转为 OVERLAPPED* 。我试了很多遍Marshal.PtrToStructure/StructureToPtr 和StringToBSTR,总是无法成功通过I/O完成端口传递string。 

我还曾经用以下这2个函数将string转换为byte[],然后将byte[]转换为NativeOverlapped。总是不行。 

System.Threading.NativeOverlapped Ov = new NativeOverlapped(); 
byte[] btRaw = Str2Arr(strValue); 
Ov = (System.Threading.NativeOverlapped) 
RawDeserialize(btRaw, typeof(System.Threading.NativeOverlapped)); 

函数声明如下: 
public static byte[] Str2Arr(String s) 

return (new UnicodeEncoding()).GetBytes(s); 

public static string Arr2Str(byte[] buffer) 

return (new UnicodeEncoding()).GetString(buffer, 0, buffer.Length); 

public static byte[] RawSerialize( object anything ) 

int rawsize = Marshal.SizeOf( anything ); 
IntPtr buffer = Marshal.AllocHGlobal( rawsize ); 
Marshal.StructureToPtr( anything, buffer, false ); 
byte[] rawdatas = new byte[ rawsize ]; 
Marshal.Copy( buffer, rawdatas, 0, rawsize ); 
Marshal.FreeHGlobal( buffer ); 
return rawdatas; 


public static object RawDeserialize( byte[] rawdatas, Type anytype ) 

int rawsize = Marshal.SizeOf( anytype ); 
if( rawsize > rawdatas.Length ) 
return null; 
IntPtr buffer = Marshal.AllocHGlobal( rawsize ); 
Marshal.Copy( rawdatas, 0, buffer, rawsize ); 
object retobj = Marshal.PtrToStructure( buffer, anytype ); 
Marshal.FreeHGlobal( buffer ); 
return retobj; 
}
目录
相关文章
|
3月前
|
编译器 API C语言
C语言与硬件交互:通过I/O端口控制硬件。
C语言与硬件交互:通过I/O端口控制硬件。
90 0
|
存储 安全 编译器
C#中使用I/O文件流
流,即是二进制数值,文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。在 .NET 中,System.IO命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。命名空间:System.IO程序集:System.Runtime.dll。
93 1
msp430 I/O端口中断实验
单片机的P1.0引脚连接一个LED灯, P1.1引脚连接一个开关。要求 编写程序,利用中断方法检测P1.1引脚处的开关是否被按下。每按一下开关,P1.0连接的LED 亮灭状态就变换一次。
139 0
msp430 I/O端口中断实验
|
消息中间件 API Windows
|
关系型数据库 C# 分布式数据库
|
安全 芯片 Windows
34、I/O端口操作
    I/O端口操作在Windows操作系统中属于特权命令,必须在内核模式下运行。在DOS中,I/O端口操作主要通过IN/OUT指令来进行。  一、I/O端口操作实现  1、DDK实现I/O端口操作 READ_PORT_UCHAR The READ_PORT_UCHAR macro reads a byte from the specified port address。
1045 0
|
存储 C# 数据库
C#笔记28:I/O操作
C#笔记28:I/O操作 本章概要: 1:基本文件I/O    1.1:用于文件 I/O 的类    1.2:用于从流读取和写入流的类    1.3:通用 I/O 流类 2:通用I/O任务 3:独立存储     3.1:为什么要使用独立存储    3.2:使用独立存储        以下的区别有助于澄清文件和流的差异。
756 0
|
4月前
|
弹性计算 应用服务中间件 Linux
阿里云服务器开放端口完整图文教程
笔者近期开发完成的服务端程序部署在阿里云的ECS云服务器上面,一些应用程序配置文件需要设置监听的端口(如Tomcat的8080、443端口等),虽然通过CentOs 7系统的的「防火墙」开放了对应的端口号,任然无法访问端口号对应的应用程序,后面了解到原来还需要设置云服务器的「安全组规则」,开放相应的端口权限,服务端的接口才能真正开放。
661 1
阿里云服务器开放端口完整图文教程