getsockname函数获取本地IP为何是127.0.0.1情况分析

时间:2025-03-21 08:29:47

最近在项目测试的时候发现一个问题,getsockname接口获取的IP地址在有些机器上是真正的IP地址例如192.168.2.207,有些机器获取出来的是127.0.0.1这个地址。
为什么会出现getsockname获取的是127.0.0.1这个问题,我认真去探究了一下。
部分代码如下:

    //等待处理
    while(1)
    {
       //等待client端的连接
       newFd=accept(sockfd,(struct sockaddr *)&from,&len);
       if(newFd==-1)  continue;

	    getsockname(newFd, (struct sockaddr *)&addr, &len);
	    //getsockname(sockfd, (struct sockaddr *)&addr, &len);
	    ptr = inet_ntoa(addr.sin_addr);
	    printf("%s:%d", ptr, htons(addr.sin_port));
	    。。。。。
	}

场景说明:在测试的时候,服务器和客户端不在同一电脑,获取IP的真实网卡IP,在同一台电脑就是127.0.0.1
原因分析:如果你的客户端和服务端在同一台机器上,那么你的数据交互就不涉及真实IP地址,只是经过本机而已,所以拿到的地址就是127.0.0.1。不在同一电脑,那么他们数据交互肯定是经过真实IP地址的,所以通过socket拿到的IP就是真实的
PS:只针对我这个情况作了分析,其它情况不一定适用~
getsockname函数是要对accept返回值使用, 不是进行listen或bind的那个socket,如我上面的代码:
是getsockname(newFd, (struct sockaddr *)&addr, &len);//newFd,accept返回值
而不是getsockname(sockfd, (struct sockaddr *)&addr, &len);//sockfd