gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:10 27 4
gpt4 key购买 nike

我想获取启动我的程序的计算机的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com