gpt4 book ai didi

c - 我的获取 IP 地址 C 函数未输出正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 08:52:26 25 4
gpt4 key购买 nike

这是我的函数,用于获取和输出无线 en1 的 IP 地址。

char* getIPAddress(char* src)
{

struct ifaddrs *ifaddr, *ifa;
int family;

if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}

for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
family = ifa->ifa_addr->sa_family;
if (0 == strcmp(ifa->ifa_name,"en1" ) && (family == AF_INET)) { // v4
// en1

inet_ntop(ifa->ifa_addr->sa_family,&((struct sockaddr_in*)ifa)->sin_addr,src,sizeof(struct sockaddr_in));
}
}

freeifaddrs(ifaddr);
return src;
}

我期待 129.10.10.50 或类似的东西,但现在它输出空白。

最佳答案

这是不正确的:

inet_ntop(
ifa->ifa_addr->sa_family,
&((struct sockaddr_in*)ifa)->sin_addr, // <--- casting wrong variable
src,
sizeof(struct sockaddr_in)
);

你正在将 struct ifaddrs 转换为 struct sockaddr_in 而不是它的成员:

struct ifaddrs {
struct ifaddrs *ifa_next; /* Next item in list */
char *ifa_name; /* Name of interface */
unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */

struct sockaddr *ifa_addr; /* Address of interface */ // <--- this one

struct sockaddr *ifa_netmask; /* Netmask of interface */
union {
struct sockaddr *ifu_broadaddr;
/* Broadcast address of interface */
struct sockaddr *ifu_dstaddr;
/* Point-to-point destination address */
} ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void *ifa_data; /* Address-specific data */
};

这将修复它:

inet_ntop(
ifa->ifa_addr->sa_family,
&((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, // ifa_addr member instead
src,
sizeof(struct sockaddr_in)
);

你也可以跳出循环。

关于c - 我的获取 IP 地址 C 函数未输出正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19172013/

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