打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
完成端口怎么得到客户端IP地址?
userphoto

2013.12.20

关注
是用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来获得端口得地址



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
完成端口详解
IOCP服务器设计(via Modern C++)
WinSock2编程之打造完整的SOCKET池
Windows系统编程之异步I/O和完成端口
gh0st源码分析与远控的编写(二)
delphi idtcpclient和idtcpserver的心跳包
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服