socket getpeernamee() 在客户端正...

GetPeerName获取连入的客户端IP 端口 - CSDN博客
GetPeerName获取连入的客户端IP 端口
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
TRACE(&GetPeerName ErrorCode:%d\n&,GetLastError());
delete lpSockAddrIn;
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
CString *lpstrPeerIP = new CS//注3
UINT nPeerPort = 0;
if(client.GetPeerName(*lpstrPeerIP,nPeerPort)){//注4
TRACE(&GetPeerName Success:%s:%d&,*lpstrPeerIP,nPeerPort);
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”有对应项目,会返回对应网址;(待更新)
本文已收录于以下专栏:
相关文章推荐
本文主要介绍了getsockname()和getpeername()的内核实现。
内核版本:3.6
Author:zhangskd @ csdn blog
int getsocknam...
getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址。
int getsockname(int sockfd, struct sockaddr * loca...
getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址。
int getsockname(int sockfd, struct sockaddr * locala...
getsockname和getpeername函数
getsockname函数用于获取与某个套接字关联的本地协议地址 
getpeername函数用于获取与某个套接字关联的外地协议地址
//这段代码没有实际的功能,只是为了获取连接另一端的ip地址 #include
#pragma comment(lib, &wsock32&)
贫僧是名学生,主机通常只是用来上网浏览,不会***太多软件。大多数软件***与操作都是在虚拟机中进行。所以贫僧想在虚拟机中***学校的校园网客户端,在虚拟机连上外网后共享网络给主机。在上网查询并整理思路,总...
#include &unp.h&
main(int argc, char **argv)
libuv中处理tcp连接的handle叫做uv_tcp_t,可以认为它是uv_stream_t的子类,所以它是可以当作流来使用的,这篇主要内容不在这,其实主要介绍两个函数
UV_EXTERN in...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)本帖子已过去太久远了,不再提供回复功能。

参考资料

 

随机推荐