是用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的指针来调用吗?
搞错掉了,看了头文件才知道,g_fnGetAcceptExSockaddrs需要传WSAID_GETACCEPTEXSOCKADDRS参数,
即:
GUID GetAcceptExaddrsGuid = WSAID_GETACCEPTEXSOCKADDRS;
WSAIoctl(sock,SIO_GET_EXTENSION_FUNCTION_POINTER,
&GetAcceptExaddrsGuid,
sizeof(GetAcceptExaddrsGuid),
&g_fnGetAcceptExSockaddrs,
sizeof(g_fnGetAcceptExSockaddrs),
&bytes,
NULL,
NULL
);
才对,原来代码中g_fnGetAcceptExSockaddrs其实得到的是AcceptEx指针,偏偏两个函数参数是一样多且类型可兼容,真是上一大当。
楼主你在客户端也是调用SIO_GET_EXTENSION_FUNCTION_POINTER这个函数么?
如果在一台机子上同时调用,客户端会失败,你可以试一试。以前我做地时候遇到这样得情况
我没有做客户端,是用ftp命令测试,VC调试服务器程序的。
To DentistryDoctor(雅克医生<改行做程序员了>) :
你的方法对完成端口SOCKET不起作用,getpeername失败,WSAGetLastError返回代码10057,Error LookUp翻译过来意思是:
由于套接字没有连接并且 (当使用一个 sendto 调用发送数据报套接字时) 没有提供地址,发送或接收数据的请求没有被接受。
但是我在WSAGetLastError后紧接着调用send是成功的,这个错误看起来蛮奇怪的。看来是必须用GetAcceptExSockaddrs才行。
所以必须使用GetAcceptExSockaddrs来获得端口得地址
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。