完成端口怎么得到客户端IP地址?
是用GetAcceptExSockaddrs吗?
但是这样有个问题,就是看关于完成端口的资料,有这么一段:
未获取函数指针就调用函数(如直接连接mswsock..lib并直接调用AcceptEx)的消耗是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的。每次应用程序常试在服务提供层上(mswsock之上)调用AcceptEx时,都要先通过WSAIoctl获取该函数指针。如果要避免这个很影响性能的操作,应用程序最好是直接从服务提供层通过WSAIoctl先获取这些APIs的指针。
根据这个建议,于是用WSAIoctl获取函数指针:
#include <mswsock.h>
GUID acceptex_guid = WSAID_ACCEPTEX;
LPFN_ACCEPTEX g_fnAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS g_fnGetAcceptExSockaddrs;
DWORD bytes;
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
WSAIoctl(sock,SIO_GET_EXTENSION_FUNCTION_POINTER,&acceptex_guid,sizeof(acceptex_guid),&g_fnAcceptEx,sizeof(g_fnAcceptEx),&bytes,NULL,NULL);
WSAIoctl(sock,SIO_GET_EXTENSION_FUNCTION_POINTER,
&acceptex_guid,
sizeof(acceptex_guid),
&g_fnGetAcceptExSockaddrs,
sizeof(g_fnGetAcceptExSockaddrs),
&bytes,
NULL,
NULL
);
然后用g_fnAcceptEx和g_fnGetAcceptExSockaddrs代替AcceptEx和GetAcceptExSockaddrs,
g_fnAcceptEx正常,但是客户端连接后用g_fnGetAcceptExSockaddrs却得不到客户端IP地址,
而直接用AcceptEx和GetAcceptExSockaddrs却能得到,真是奇怪了。而且GetAcceptExSockaddrs
必须是用AcceptEx而不是g_fnAcceptEx接受的客户端才能得到地址。
难道说不能通过获取API的指针来调用吗?