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

我想获取启动程序的计算机的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地址? 的全部内容, 来源链接: utcz.com/qa/401131.html

回到顶部