wow-net-iface文件说明
- 项目地址:https://gitee.com/wow-iot/wow-iot7
- 本文件的的功能实现网络接口信息的获取,包括获取本机接口的IP、MASK、MAC等,还有检查网线是否接入、设置IP等小功能。
获取所有iface接口名称
StringList_T* wow_eth_getIfaceName(void)
{
int fd = 0;
int ret = 0;
int if_num = 0;
struct ifconf ifc;
struct ifreq buf[MAX_IP_SIZE];
StringList_T* list = NULL;
fd = socket(AF_INET, SOCK_DGRAM, 0);
CHECK_RET_VAL_ERRNO_P(fd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
memset(&ifc, 0, sizeof(struct ifconf));
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t)buf;
ret = ioctl(fd, SIOCGIFCONF, &ifc);
CHECK_RET_GOTO_ERRNO_P(ret == 0, out,-SYSTEM_IOCTRL_FAILED,"ioctl SIOCGIWESSID faild\n");
if_num = ifc.ifc_len / sizeof(struct ifreq);
CHECK_RET_GOTO_ERRNO_P(if_num > 0, out,-SYSTEM_IOCTRL_FAILED,"ioctl SIOCGIWESSID faild\n");
list = wow_stringlist_new();
while (if_num-- > 0) {
ret = wow_stringlist_append(list,buf[if_num].ifr_name);
CHECK_RET_BREAK_P(ret == 0,"wow_stringlist_append failed.");
}
close(fd);
return list;
out:
close(fd);
return NULL;
}
检测iface接口是否网线拔出
int wow_eth_checkIfaceRunning(const char *pcIface)
{
int ret = -1;
int sockfd = 0;
CHECK_RET_VAL_P(pcIface,-PARAM_INPUT_DATA_IS_NULL, "param input data invalid!\n");
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
CHECK_RET_VAL_P(sockfd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, pcIface,IFNAMSIZ);
ret = ioctl(sockfd, SIOCGIFFLAGS, &ifr);
CHECK_RET_VAL_EXE_P(ret == 0,-SYSTEM_IOCTRL_FAILED,close(sockfd),"ioctl SIOCGIWESSID faild\n");
close(sockfd);
//拔除网络线时会造成 IFF_RUNNING 的改变,IFF_UP 不会因插拔网络线而有任何变化
if (ifr.ifr_flags & IFF_RUNNING) {
return 1;
}
return (ifr.ifr_flags & IFF_RUNNING)?0:-WOW_FAILED;
}
获取iface接口IP、MASK、MAC地址
int wow_eth_getIfaceIp(char *pcIface, char *pcIp)
{
int ret = -1;
int sockfd = -1;
struct ifreq ifr;
struct sockaddr_in *addr = NULL;
CHECK_RET_VAL_P(pcIface && pcIp,-PARAM_INPUT_DATA_IS_NULL, "param input data invalid!\n");
memset(&ifr, 0, sizeof(struct ifreq));
strncpy(ifr.ifr_name, pcIface,IFNAMSIZ);
addr = (struct sockaddr_in *)&ifr.ifr_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
CHECK_RET_VAL_P(sockfd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
//get the pcIp of this interface
ret = ioctl(sockfd, SIOCGIFADDR, &ifr);
CHECK_RET_VAL_EXE_P(ret == 0,-SYSTEM_IOCTRL_FAILED,close(sockfd),"ioctl SIOCGIFADDR faild\n");
strncpy(pcIp, inet_ntoa(addr->sin_addr), MAX_IP_SIZE);
close(sockfd);
return WOW_SUCCESS;
}
int wow_eth_getIfaceMac(char *pcIface, char *pcMac)
{
int ret = -1;
int sockfd = -1;
struct ifreq ifr;
CHECK_RET_VAL_P(pcIface && pcMac,-PARAM_INPUT_DATA_IS_NULL, "param input data invalid!\n");
memset(&ifr, 0, sizeof(struct ifreq));
strncpy(ifr.ifr_name, pcIface,IFNAMSIZ);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
CHECK_RET_VAL_P(sockfd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
ret = ioctl(sockfd, SIOCGIFHWADDR, &ifr);
CHECK_RET_VAL_EXE_P(ret == 0,-SYSTEM_IOCTRL_FAILED,close(sockfd),"ioctl SIOCGIFHWADDR faild\n");
//get the mac of this interface
snprintf(pcMac, 32,
"%02X:%02X:%02X:%02X:%02X:%02X",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
close(sockfd);
return WOW_SUCCESS;
}
int wow_eth_getIfaceMask(char *pcIface, char* pcMask)
{
int ret = -1;
int sockfd = -1;
struct ifreq ifr;
CHECK_RET_VAL_P(pcIface && pcMask,-PARAM_INPUT_DATA_IS_NULL, "param input data invalid!\n");
memset(&ifr, 0, sizeof(struct ifreq));
strncpy(ifr.ifr_name, pcIface,IFNAMSIZ);
struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_netmask;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
CHECK_RET_VAL_P(sockfd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
//get the subnet mask of this interface
ret = ioctl(sockfd, SIOCGIFNETMASK, &ifr);
CHECK_RET_VAL_EXE_P(ret == 0,-SYSTEM_IOCTRL_FAILED,close(sockfd),"ioctl SIOCGIFNETMASK faild\n");
snprintf(pcMask, 16, "%s",(char *)inet_ntoa(addr->sin_addr));
close(sockfd);
return WOW_SUCCESS;
}
设置iface接口Ip地址
int wow_eth_setIfaceIp(char *pcIface, char *pcIp)
{
int ret = -1;
int sockfd = -1;
struct ifreq ifr;
struct sockaddr_in *addr = NULL;
CHECK_RET_VAL_P(pcIface && pcIp,-PARAM_INPUT_DATA_IS_NULL, "param input data invalid!\n");
memset(&ifr, 0, sizeof(struct ifreq));
strncpy(ifr.ifr_name, pcIface,IFNAMSIZ);
addr = (struct sockaddr_in *)&ifr.ifr_addr;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr(pcIp);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
CHECK_RET_VAL_P(sockfd > 0,-SOCKET_OPEN_FAILED,"socket faild\n");
//get the pcIp of this interface
ret = ioctl(sockfd, SIOCSIFADDR, &ifr);
CHECK_RET_VAL_EXE_P(ret == 0,-SYSTEM_IOCTRL_FAILED,close(sockfd),"ioctl SIOCGIWESSID faild\n");
close(sockfd);
return WOW_SUCCESS;
}