[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; 
}

时间: 2024-08-30 09:38:02

[C#]I/O完成端口的实现的相关文章

eMule如何打开端口

  eMule监听在两个端口上,从0.47c版开始它是在第一次开始时随机选择的(早期版本曾默认使用端口4662和4672),可以在"选项"菜单(见下面的图片)里查看eMule已经选择了哪个端口.也可以在你需要的时候修改那些端口,eMule可以在任何端口工作. 两个端口中,标了A的是TCP端口,B是UDP端口.请注意实际的端口在你的eMule上是不同的,所以请在选项对话框里查看,不用抄例子图片里的端口号. 现在需要在路由器或防火墙上的地址映射或者端口重定向设置上打开那些端口.eMule将

阿里云SLB使用Windows 2008/Windows 2012时TCP端口不通

Linux使用LVS DR或者阿里云的SLB TCP模式转发时,需要关闭rp_filter参数,否则会造成健康检查正常,但是端口不通的情况. 随着Windows系统的升级,在Windows2008以上版本, 也有了这样类似功能的参数weakhostsend(中文版系统叫弱主机),如果弱主机发送接收被禁用,就会导致阿里云TCP协议的SLB转发异常.win/linux下这个参数的功能是类似的,都是为了 防止跨接口转发数据包. 我们来测试一下: 1 2 SLB VIP: 101.201.178.107

Mysql 查看端口号的几种方式

链接: http://blog.itpub.net/blog/post/id/1592460/ 标题: MySQL 查看端口的几种方式 作者:lōττéry版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] 注释:    今天通过"Navicat for MySQL"工具链接生产环境数据库时,需要输入 mysql"端口"号,所以找到了几种 查看mysql端口的方法,特此整理下提供参考.   默认端口 3306:    OS层 ***** ps

udp-win7 系统,如何屏蔽“英雄联盟”的端口,让它不能玩!

问题描述 win7 系统,如何屏蔽"英雄联盟"的端口,让它不能玩! win7 系统,如何屏蔽"英雄联盟"的端口,让它不能玩! 在运行"英雄联盟"的时候,发现它有两个UDP端口,每次启动,端口号都不一样! 大致在50000到65355之间浮动,如何才能屏蔽掉这个区间内的UDP端口? 求各位大神指点!谢谢! 解决方案 你在WIN7本地连接中就可以做到,把这些端口加进去就可以了. 解决方案二: 设置系统的本地安全策略 解决方案三: 设置组策略,直接禁用

如何控制端口流量不让交换机被顶死

交换机是局域网中的重要连接"枢纽",一旦它的工作状态出现意外的话,那么连接到该交换机上的所有计算机都得"遭殃",轻则出现上网缓慢的现象,严重的话干脆就不能上网了,为此选择性能优越.质量上乘的交换机来组建一些重要网络,是非常关键的.然而,无论性能多么优越.无论质量怎么上乘的交换机,如果不加以妥善管理.维护,那么它的工作状态就很容易出现意外.这不,本文下面一则网络故障,就是由于网络管理员没有对交换端口的流量进行限制,造成了交换机被大流量"顶死",最终

抓包技术-关于在镜像端口抓包分析问题

问题描述 关于在镜像端口抓包分析问题 30C 实验中若是使用具备镜像端口功能的路由器,将流经实际网卡的所有数据包都镜像到另一个端口,请问可以用哪些方法捕获该镜像端口上的数据包并进行解析分析.各种方法的优缺点??急急急 解决方案 http://wenku.baidu.com/link?url=pvyFRbVOfcOBW2QrAMWA7_3HpfJarLPn46KMlko5vWStybqRRxgIyozPgs_gWC5st2YRH-4nzRioAu8n2zeZuKUi4AzHhe1Z4cbaxl6s

php-ecshop获取端口的疑问

问题描述 ecshop获取端口的疑问 if (isset($_SERVER['SERVER_PORT'])) { $port = ':' . $_SERVER['SERVER_PORT']; if ((':80' == $port && 'http://' == $protocol) || (':443' == $port && ' https://' == $protocol)) { $port = ''; } } 其中 if ((':80' == $port &

java代码java-关于Java五子棋游戏端口被占用,玩家无法添加

问题描述 关于Java五子棋游戏端口被占用,玩家无法添加 如何在其中添加玩家,求大神帮助,具体步骤 解决方案 写个函数判断哪些端口被用到,用那些还没被用到的端口就好了. 解决方案二: 检查下防火墙,换一个端口,使用随机端口

C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗?

问题描述 C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗? C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗?另外,一台计算机上(不经过路由器或交换机)只能有一个组播吗?急求!!! 解决方案 组播地址和多播地支的关系与TCP中IP和端口的关系不太一样. 首先,网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序.通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧. 使

Windows查看端口被占用的程序!

"到底是谁占用了80端口,该怎么查,怎么终止它?",这里就简单讲解一下,在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等.          这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:          >netstat -aon | findstr "80"