我需要在C ++中获取系统的IP地址。我在这里遵循了另一条评论的逻辑和建议并创建了一个套接字,然后利用getsockname来确定套接字绑定的IP地址。
但是,这似乎不起作用(下面的代码)。当我收到128.etc
时,我收到一个无效的IP地址(58.etc)有什么想法吗?
string Routes::systemIP(){
// basic setup
int sockfd;
char str[INET_ADDRSTRLEN];
sockaddr* sa;
socklen_t* sl;
struct addrinfo hints, *servinfo, *p;
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
if ((rv = getaddrinfo("4.2.2.1", "80", &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return "1";
}
// loop through all the results and make a socket
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("talker: socket");
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "talker: failed to bind socket\n");
return "2";
}
// get information on the local IP from the socket we created
getsockname(sockfd, sa, sl);
// convert the sockaddr to a sockaddr_in via casting
struct sockaddr_in *sa_ipv4 = (struct sockaddr_in *)sa;
// get the IP from the sockaddr_in and print it
inet_ntop(AF_INET, &(sa_ipv4->sin_addr.s_addr), str, INET_ADDRSTRLEN);
printf("%s\n", str);
// return the IP
return str;
}
答案 0 :(得分:1)
您的代码已包含提示:failed to bind socket
。但是你削减了尝试连接的代码部分(你是从Stevens UnP复制的吗?)。套接字未连接任何东西,因此网络堆栈尚未为其分配本地地址。
连接套接字后,内核必须根据路由表为其选择本地地址。那时getsockname(2)
将按预期工作。
答案 1 :(得分:0)
您无需分配套接字即可获取计算机的可用IP地址。您可以使用套接字API gethostname()和gethostbyname()函数。或者,在Windows上,您也可以使用Win32 API GetAdaptersInfo()或GetAdaptersAddresses()函数。