能力值:
( LV4,RANK:50 )
|
-
-
2 楼
IIS应该用的是完成端口.
AcceptEx比较特别,而且这个是微软专门在Windows操作系统里面提供的扩展函数,也就是说这个不是Winsock2标准里面提供的,是微软为了方便使用重叠I/O机制,额外提供的一些函数, 微软的实现是通过mswsock.dll中提供的,所以可以通过静态链接mswsock.lib来使用AcceptEx。但是这是一个不推荐的方式,应该用WSAIoctl 配合SIO_GET_EXTENSION_FUNCTION_POINTER参数来获取函数的指针,然后再调用AcceptEx.因为在未取得函数指针的情况下就调用AcceptEx的开销是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的(因为是微软另外提供的),所以如果直接调用AcceptEx的话,首先代码就只能在微软的平台上用了,没有办法在其他平台上调用到该平台提供的AcceptEx的版本(如果有的话), 而且更糟糕的是,每次调用AcceptEx时,Service Provider都得要通过WSAIoctl()获取一次该函数指针,效率太低了,所以还不如直接在代码中直接去这么获取一下指针好了。
LPFN_ACCEPTEX m_lpfnAcceptEx; // AcceptEx函数指针
GUID GuidAcceptEx = WSAID_ACCEPTEX; // GUID,这个是识别AcceptEx函数必须的
DWORD dwBytes = 0;
WSAIoctl(
m_pListenContext->m_Socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx,
sizeof(GuidAcceptEx),
&m_lpfnAcceptEx,
sizeof(m_lpfnAcceptEx),
&dwBytes,
NULL,
NULL);
微软有可能也是这么做的.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
感谢楼上这位朋友的回答,你的意思 是 我应该去HOOK WSAIoctl这个函数对吧?我去试下 。
但是有一点我不明白,按照你的说法,应该AcceptEx能够拿到我要的IP的啊,可是我尝试TELNET 80端口,还是没有HOOK到连接请求呢 ?我事先已经HOOK了AcceptEx这个API的
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
经过测试,HOOK住WSAIoctl还是不行,郁闷了,这个这么难么?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
听说IOCP貌似都是通过内核实现的,不需要用应用层的函数么?有大牛能指教下么?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
哎,看来这个问题太高难了,这么久都没人能解答
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
针对IIS, 查下ISAPI,客户IP,控制等都可以。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
对哦,谢谢您的提醒!
|
|
|