c - 如何用socket地址获取自己的IP地址?

标签 c linux sockets networking

我想获取启动我的程序的计算机的 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 时,这是调用 getsockname() 时套接字唯一可用的 IP。这意味着套接字绑定(bind)到所有本地接口(interface)。为了从套接字获取特定 IP,它必须绑定(bind)到特定 IP。

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

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

关于c - 如何用socket地址获取自己的IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445595/

相关文章:

c - 为什么这些构造使用增量前和增量后未定义的行为?

linux - Apache 重定向傻瓜 .aspx

linux - 无法获得语法突出显示以在 vim 中使用 R 代码

c - 接收多条消息的socket编程C

java - 如何在 java 中解析代理 socks 数据包?

c - 释放 C 堆栈并移除悬挂指针

c - c 中的重构函数

c - A5/1安全算法3

linux - Matlab 二进制文件不接受其在 shell 中的输入值

Java UDP 连接