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

最近在项目测试的时候发现一个问题,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值