/**
* @brief 获取指定网络接口的IP地址
* @details None.
* @param ifname: 网络接口名称.
* @param ip: 存储IP地址字符串的起始地址
* @param size: 存储空间大小
* @retval 0:OK.
*/
int get_ip(const char *ifname, char *ip, int size)
{
int sock;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
return -1;
}
strcpy(ifr.ifr_name, ifname);
ioctl(sock, SIOCGIFADDR, &ifr);
inet_ntop(AF_INET,&((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, ip, size);
close(sock);
return 0;
}
/**
* @brief 获取指定网络接口的子网掩码地址
* @details None.
* @param ifname: 网络接口名称.
* @param netmask: 存储掩码地址字符串的起始地址
* @param size: 存储空间大小
* @retval 0:OK.
*/
int get_netmask(const char *ifname, char *netmask, int size)
{
int sock;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
return -1;
}
strcpy(ifr.ifr_name, ifname);
ioctl(sock, SIOCGIFNETMASK, &ifr);
inet_ntop(AF_INET,&((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr, netmask, size);
close(sock);
return 0;
}
/**
* @brief 获取默认网关地址
* @details None.
* @param ifname: 网络接口名称.
* @param gateway: 存储网关地址字符串的起始地址
* @param size: 存储空间大小
* @retval 0:OK.
*/
int get_gateway(const char *ifname, char *gateway, int size)
{
int ret=-1;
FILE *fp;
char sys_cmd[32];
char buf[256], *tmp, *p;
strcpy(sys_cmd, "ip route");
fp = popen(sys_cmd, "r");
if (fp == NULL) {
return -1;
}
while(fgets(buf, sizeof(buf), fp) != NULL) {
tmp = strstr(buf, "default");
p = strstr(buf, ifname);
if(tmp && p) {
p = strstr(tmp, "via ");
if (p != NULL) {
p+=4;
tmp = strchr(p, ' ');
if (tmp != NULL) {
*tmp = '\0';
}
snprintf(gateway, size, "%s", p);
ret = 0;
}
break;
}
}
pclose(fp);
return ret;
}
Linux下获取网络配置的C语言实现
于 2025-10-13 15:46:15 首次发布

5234

被折叠的 条评论
为什么被折叠?



