您的位置:首页 > 编程语言 > PHP开发

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 );

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”有对应项目,会返回对应网址;(待更新)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 GetPeerName