- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想获取启动我的程序的计算机的 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/15914790/
我是一名优秀的程序员,十分优秀!