当前位置: 首页 > 面试题库 >

如何使用套接字地址获取自己的IP地址?

柴高岑
2023-03-14
问题内容

我想获取启动程序的计算机的IP地址,然后将其发送到客户端,但是我总是得到0.0.0.1而不是真实的IP地址(例如127.0.0.1)。

我目前可以获取端口,但无法获取IP地址。

我怎么才能得到它?

最好的解决方案是能够使用sockaddr_in。这是我目前正在做的事情:

int open_connection(char* ip, int* port)
{
  int                   sock;
  struct sockaddr_in    sin;
  socklen_t             len;
  int                   i;

  i = 0;
  len = sizeof(sin);
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    return (-1);
  bzero(&sin, sizeof(struct sockaddr_in));
  sin.sin_family = AF_INET;
  if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) != 0)
    perror("Error on bind");
  if (getsockname(sock, (struct sockaddr *)&sin, &len) != 0)
    perror("Error on getsockname");
  strcpy(ip, inet_ntoa(sin.sin_addr)); // IP = 0.0.0.0
  *port = sin.sin_port;
  return (sock);
}

编辑: 我知道我的思维方式走错了路。所以我的问题是:获得自己的IP地址的最佳方法是什么?


问题答案:

当您bind()将套接字设为0.0.0.0时,这是调用时套接字唯一可用的IP
getsockname()。这意味着套接字已绑定到所有本地接口。为了从套接字获取特定的IP,必须将其绑定到特定的IP。

无论如何,使用套接字API获取计算机的本地IP是错误的方法。一个常见的错误是gethostname()gethostbyname()或一起使用getaddrinfo()本地IP列表。通常这是可行的,但是它有一些隐藏的陷阱可能导致虚假信息,但是人们往往会忽略这一事实,或者甚至一开始甚至都不了解(我多年来都不知道这一点,但是后来我学得更好)。

相反,您确实应该使用特定于平台的API来枚举本地网络接口。这将提供更可靠的信息。Windows有GetAdaptersInfo()GetAdaptersAddresses()。其他平台都有getifaddrs()。这些将告诉您哪些本地IP可用。然后,您可以bind()为0.0.0.0设置套接字,以接受任何这些IP上的客户端,或者bind()为特定IP设置套接字,以仅接受该IP上的客户端。



 类似资料:
  • 问题内容: 我听说可以通过创建一个并将我的()连接到有效的目标IP地址(例如Google)来获得自己的IP地址(不是127.0.0.1)。 但是,我找不到任何参考或示例。 这可能吗?如果是这样,我该怎么做? 问题答案: 呼叫,然后在您的套接字上。它将返回套接字现在绑定到的IP地址,该地址已被IP路由表选择为到达目标地址的最佳路由。 但是,除非您只有一个外部IP地址,否则不一定是您要查找的IP地址。

  • 问题内容: 我如何获得本地IpAddress? 当我使用该功能时,我将无法再继续使用。我不能使用该功能。 是否有其他方法可以执行此操作,或者我是否以错误的方式进行操作? 问题答案: 在讨论中发现,OP需要Mac上的接口地址,而不是我最初想的那样在iOS设备上。问题中引用的代码将检查接口名称“en0”,它是iPhone上的WiFi接口。在Mac上,改为检查任何“正在运行”的界面更有意义。因此,我重写

  • 问题内容: 我想获取计算机的IP地址。我使用了下面的代码,但是返回了。 我想获取IP地址(例如),而不是回送地址。 问题答案: 您需要遍历所有网络接口 播放(取自util / helper.go)

  • 问题内容: 我不是指 127.0.0.1 而是其他计算机将用来访问该计算机的计算机,例如 192.168.1.6 问题答案: http://nodejs.org/api/os.html#os_os_networkinterfaces

  • 我希望在连接到wifi网络时,在运行我的应用程序的手机上获取用户的本地IPv4地址。使用以下代码: 我可以得到一些接近IPv4地址的信息,但与命令行中的IPv4地址相比,它并不完全相同。有更好的办法吗?我知道formatIpAddress已被弃用,但在我找到获取IPv4地址的方法之前,我暂时不太担心这个问题。 编辑: 我发现手机wifi设置中的ip地址是我在使用建议的解决方案获取ip地址时得到的。

  • 问题内容: 有没有办法使用libpcap在Linux中获取接口的IP地址? 我发现了这个, 获取Linux上一个接口的IP地址,但这不使用pcap。 此外,在PCAP例子是说,像这应该得到你的IP,但它给你的网络地址。 问题答案: 使用功能: 输出: