误人子弟的微软(zz)

天又有人向我推荐某个库,据说能比winsock好使,增加了各种各样的新特性
于是我打算说说这个事情,因为实在太多了
其实之所以出现那么多的winsock扩展,只是因为微软先有了那个破win95,
导致了winsock也成了一个非常非常蹩脚的封装,又因为这个蹩脚的winsock,才会有这许多的扩展
举个例子,就说connect
connect是一个bsd的东西,它是非异步的操作,在windows上线程的代价昂贵,所以很多人都头疼这个东西
微软明显也知道这个问题,所以它有自己的一个扩展,就是WSAConnect,这个玩意儿可以让你指定一个事件,
然后你可以在connect完成之后得到一个事件的signal
然后这个还是不够,又在XP/2003里面加上一个ConnectEx,这就可以不局限于事件了,可以用APC,还能绑定到IOCP.
现在许多所谓的扩展,很大程度上不外乎是或者利用了这些新的函数,或者自己做一套来解决相似的问题
可是其实这全都不是什么新东西,早在NT 4.0就已经有了
一个SOCKET无非是一个句柄,它具有IFS 句柄的所有特性,本来就是异步的,本来就可以绑定到IOCP上,就说这个connect,
经过了winsock包装的层层中转之后,它最终不外是达到这样一个调用

status = NtDeviceIoControlFile(
        Socket,
        NULL,
        NULL,
        ConnectContext,
        &ConnectContext->IoStatusBlock,
        IOCTL_AFD_CONNECT,
        &ConnectContext->ConnectInfo,
        ConnectContext->ConnectInfoLength,
        &ConnectContext->IoStatusBlock,
        sizeof (ConnectContext->IoStatusBlock)
        );
这里第一个NULL本来可以是一个事件的句柄,第二个NULL本来可以是一个APC函数的地址,通过这两个参数,你本可以
1.设定一个事件,connect完成后得到一个signal
2.设定一个APC函数,
 a) connect完成之后得到一个callback,在调用线程执行
 b) connect完成之后得到一个callback,在socket绑定的IOCP线程执行
只是winsock没有让你设置这两个参数,而是简单的把它们设为NULL,结果把这个功能隐藏起来了 ! (现在却装作给了你两个新函数)
微软就是这样奇怪,他做了一个完整的内核,然后通过一个蹩脚的封装,给你一个破产品...

相似的例子就是那个破OVERLAPPED结构,在NT内核当中,所有的callback context都是一个void *,这本来可以有更好的C++兼容性
不知道微软那些人怎么想的,弄出OVERLAPPED这么个畸形的玩意儿,结果呢?
本来你可以这样做(NTDLL)
struct TWorker
{
 virtual void __stdcall OnCompletion(IO_STATUS_BLOCK * Status)
 {
     // File Read Completed, process data
   
 }
 
}
TWorker * pWorker = new Tworker;
NtReadFile( hFile,pWorker....)
 
 
通过OVERLAPPED结构却不能,因为在ReadFile中只能指定一个OVERLAPPED的指针,TWorker却不能继承OVERLAPPED结构,因为没有地方放VTBL !

结果只能变成(KERNEL32)
struct MY_OVERLAPPED : OVERLAPPED
{
    TWorker * m_pWorker;
};
ReadFile(hFile,.... MY_OVERLAPPED *)....
别扭吧? 郁闷吧?
 
因为这个丑陋的OVERLAPPED结构,原来非常简洁的iocp,一个典型的client/server方式,变成了杂乱的GetOverlappedResult那样的垃圾...
 
其实这些东西在微软也已经乱了套,就说ConnectEx吧,执行完毕,你如果调用WSAGetLastError,返回的是一个Winsock 的错误代码,但如果你把它绑定到一个完成端口,返回的却是一个标准的NTSATUS ! 这两者的区别就不用我说了吧...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值