GetPeerName获取连入的客户端IP 端口
2014-02-27 11:17
330 查看
CAsyncSocket::GetPeerName()有两个重载:
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
当函数正常执行时,返回非0值;如果返回0,可以通过调用GetLastError() 函数取得错误码;
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
注1:MSDN对于lpSockAddrLen参数的解释是
A pointer to the length of the address in lpSockAddr in bytes.
On return, the lpSockAddrLen argument contains the actual size of lpSockAddr returned in bytes.
这应该是一个输入输出参数,之前编写代码时由于忽略了前一句,直接置0传入,导致函数返回错误,ErrorCode 为10014 :
编译器通过此种方式标志这是未初始化的堆内存;(有些疑问,待更新)
注2:SOCKADDR_IN结构体中的成员输出时,应注意转换,特别是端口,应注意将网络序转为本机序(有些系统下字节序与网络相同,不转也可以,为保证所有情况正常,还是转一下);
注3:此处不用指针也可以,这样是为了方便方便向后面其他函数传递参数;
new的指针记得delete;
注4:使用此重载时,客户端从本机连接”127 0 0 1“时此处得到的是本机的机器名,如果hosts文件中“127 0 0 1”有对应项目,会返回对应网址;(待更新)
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
当函数正常执行时,返回非0值;如果返回0,可以通过调用GetLastError() 函数取得错误码;
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
SOCKADDR_IN* lpSockAddrIn = new SOCKADDR_IN; int nPeerLen =sizeof(SOCKADDR_IN);//注1 if(client.GetPeerName((SOCKADDR*)lpSockAddrIn,&nPeerLen)){//client为CSocket类实例 TRACE("GetPeerName Success:%s:%d", inet_ntoa(lpSockAddrIn->sin_addr),ntohs(lpSockAddrIn->sin_port));//注2 }else{ TRACE("GetPeerName ErrorCode:%d\n",GetLastError()); } delete lpSockAddrIn;
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
CString *lpstrPeerIP = new CString;//注3 UINT nPeerPort = 0; if(client.GetPeerName(*lpstrPeerIP,nPeerPort)){//注4 TRACE("GetPeerName Success:%s:%d",*lpstrPeerIP,nPeerPort); }else{ TRACE("GetPeerName ErrorCode:%d\n",GetLastError()); } delete lpstrPeerIP;
注1:MSDN对于lpSockAddrLen参数的解释是
A pointer to the length of the address in lpSockAddr in bytes.
On return, the lpSockAddrLen argument contains the actual size of lpSockAddr returned in bytes.
这应该是一个输入输出参数,之前编写代码时由于忽略了前一句,直接置0传入,导致函数返回错误,ErrorCode 为10014 :
10014: Bad address. The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).此时获取的IP地址转换过来应为"205 205 205 205",实质为0xCDCDCDCD(Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory),
编译器通过此种方式标志这是未初始化的堆内存;(有些疑问,待更新)
注2:SOCKADDR_IN结构体中的成员输出时,应注意转换,特别是端口,应注意将网络序转为本机序(有些系统下字节序与网络相同,不转也可以,为保证所有情况正常,还是转一下);
注3:此处不用指针也可以,这样是为了方便方便向后面其他函数传递参数;
new的指针记得delete;
注4:使用此重载时,客户端从本机连接”127 0 0 1“时此处得到的是本机的机器名,如果hosts文件中“127 0 0 1”有对应项目,会返回对应网址;(待更新)
相关文章推荐
- 在socket编程中,如何获取连接另一端(客户端)的ip地址,使用accept或者getpeername
- 利用 getsockname 和 getpeername 来获取某一个链接的本地地址和远端地址
- WCF获取客户端IP和端口
- 获取客服端的IP地址-getpeername()
- php获取客户端ip get_client_ip()
- 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数
- twisted获取远程客户端ip和端口
- WebService及WCF获取客户端IP,端口
- 用getpeername函数获取套接字的地址族
- WCF/WebService如何获取客户端IP,端口
- Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法
- 在python中用BaseHTTPRequestHandler模块儿时获取客户端的ip和端口
- 获取本地IP gethostname和gethostbyname
- Delphi2010中采用DataSnap的三层网络架构服务器获取客户端ip,端口信息
- 【Tomcat】-- Tomcat + Nginx反向代理https和wss并解决获取客户端真实IP、域名、协议、端口
- php获取客户端ip get_client_ip()
- WebService及WCF获取客户端IP,端口
- nodemcu获取客户端端口ip
- php获取页面地址(带GET参数)、客户端ip、服务器端ip
- Thinkphp3.2.3框架实现自动获取客户端IP地址的get_client_ip()函数