wow-net-iface文件说明

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;
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值