/******************************************************************************
|
*
|
*
|
*******************************************************************************
|
* File name: net.c
|
* Purpose:
|
* Author: Felix(HuangFei)
|
* Version: v01.00
|
* Compiler: arm-linux-gcc
|
* Created on: 2014-11-28
|
*******************************************************************************
|
* Note:
|
* Revision history:
|
* Created by HuangFei 2014-11-28
|
******************************************************************************/
|
|
#include <stdio.h>
|
#include <sys/types.h>
|
#include <sys/socket.h>
|
#include <sys/ioctl.h>
|
#include <ctype.h>
|
|
#include <linux/sockios.h>
|
#include <netinet/in.h>
|
#include <arpa/inet.h>
|
#include <net/if_arp.h>
|
#include <unistd.h>
|
#include <net/if.h>
|
#include <net/route.h>
|
|
#include <string.h>
|
#include <ifaddrs.h>
|
|
#include "net_config.h"
|
#include <errno.h>
|
|
#define TRUE 1
|
#define FALSE 0
|
#define MAC_ADDRESS_LEN 6
|
#define PATH_PROCNET_ROUTE "/proc/net/route"
|
#define IFACE_NAME_LENGTH IF_NAMESIZE
|
|
#include <string>
|
#include <regex>
|
bool checkip(std::string ip)
|
{
|
std::regex rx2("^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$");
|
if( !regex_match(ip.cbegin(), ip.cend(), rx2) ) {
|
return false;
|
}
|
return true;
|
}
|
|
bool checkMask(std::string mask)
|
{
|
std::regex rx2("^(254|252|248|240|224|192|128|0)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)$");
|
if( !regex_match(mask.cbegin(), mask.cend(), rx2)) {
|
return false;
|
}
|
return true;
|
}
|
|
/**********************************************************************
|
* Function: SetMacAddress
|
* Description: 设置mac地址
|
* Input: pInterface :网络接口名字 如:eth0,pMacAddress:mac地址首地址
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetMacAddress(char *pInterface,char *pMacAddress)
|
{
|
struct ifreq ifr;
|
struct sockaddr *hwaddr;
|
unsigned char *hwptr;
|
int sockfd;
|
int i;
|
|
/* 判断接口输入是否正确 */
|
if((pInterface == NULL)||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h'))
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if(pMacAddress == NULL)
|
{
|
printf("input mac address error\n");
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, pInterface, sizeof(ifr.ifr_name)-1);
|
|
/*读出socket的信息*/
|
if (0 > ioctl(sockfd, SIOCGIFFLAGS, &ifr))
|
{
|
printf("close the ethx:unknown interface\r\n");
|
}
|
ifr.ifr_flags &= ~IFF_UP;
|
/*将信息写到socket中,从而关闭eth0*/
|
if (0 > ioctl(sockfd, SIOCSIFFLAGS, &ifr))
|
{
|
printf("Can't close the ethx \r\n");
|
return FALSE;
|
}
|
|
/*---------------------------------------------------------------------*/
|
/* set the interface eth0's MAC address */
|
/*---------------------------------------------------------------------*/
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, pInterface, sizeof(ifr.ifr_name)-1);
|
hwaddr=(struct sockaddr *)&ifr.ifr_hwaddr;
|
|
/*ARPHRD_ETHER=1,标识接收的ARP为以太网格式*/
|
hwaddr->sa_family = ARPHRD_ETHER;
|
hwptr=(unsigned char*)hwaddr->sa_data;
|
|
for(i=0;i<6;i++)
|
*hwptr++ = (unsigned char)pMacAddress[i];
|
|
if (0 > ioctl(sockfd, SIOCSIFHWADDR, &ifr))
|
{
|
printf("Can't set the MAC address\r\n");
|
}
|
|
/*---------------------------------------------------------------------*/
|
/* open the interface eth0 */
|
/*---------------------------------------------------------------------*/
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, pInterface, sizeof(ifr.ifr_name)-1);
|
if (0 > ioctl(sockfd,SIOCGIFFLAGS, &ifr))
|
{
|
printf("open the ethx:unknown interface\r\n");
|
}
|
ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
|
if (0 > ioctl(sockfd, SIOCSIFFLAGS, &ifr))
|
{
|
printf("Can't open the ethx\r\n");
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
}
|
|
|
/**********************************************************************
|
* Function: SetIpAddress
|
* Description: 设置ip地址
|
* Input: pInterface :网络接口名字 如:eth0,IpAddress:ip地址的
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetIpAddress(char *pInterface,const char* IpAddress)
|
{
|
|
struct ifreq ifr;
|
struct sockaddr_in *sinaddr;
|
int sockfd;
|
|
|
if((pInterface == NULL)/*||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h')*/)
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if(IpAddress == NULL)
|
{
|
printf("input ip address error\n");
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, pInterface, sizeof(ifr.ifr_name)-1);
|
sinaddr = (struct sockaddr_in *)&ifr.ifr_addr;
|
sinaddr->sin_family = AF_INET;
|
// sinaddr->sin_addr.s_addr = inet_aton(IpAddress);
|
if(inet_aton(IpAddress, &(sinaddr->sin_addr)) < 0)
|
{
|
printf("input ip address error\n");
|
return FALSE;
|
}
|
|
if (ioctl(sockfd, SIOCSIFADDR, &ifr) < 0)
|
{
|
printf("Can't set ip address\r\n");
|
return FALSE;
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: SetMaskAddress
|
* Description: 设置子网掩码
|
* Input: pInterface :网络接口名字 如:eth0,IpMask:子网掩码
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetMaskAddress(char *pInterface,const char* IpMask)
|
{
|
struct ifreq ifr;
|
struct sockaddr_in *sinaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
if((pInterface == NULL)/*||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h')*/)
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if(IpMask == NULL)
|
{
|
printf("input mask address error\n");
|
return FALSE;
|
}
|
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, pInterface, sizeof(ifr.ifr_name)-1);
|
sinaddr = (struct sockaddr_in *)&ifr.ifr_netmask;
|
sinaddr->sin_family = AF_INET;
|
// sinaddr->sin_addr.s_addr = IpMask;
|
if(inet_aton(IpMask, &(sinaddr->sin_addr)) < 0)
|
{
|
printf("input ip address error\n");
|
return FALSE;
|
}
|
|
if (0 > ioctl(sockfd, SIOCSIFNETMASK, &ifr))
|
{
|
printf("Can't set subnet netmask\r\n");
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: DelGateWay
|
* Description: 删除指定的网关
|
* Input: pInterface :网络接口名字 如:eth0,DelGateWay:网关
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool DelGateWay(char *pInterface,unsigned int DelGateWay)
|
{
|
|
struct sockaddr_in *sinaddr;
|
struct rtentry rt;
|
struct sockaddr rtsockaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
if((pInterface == NULL)||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h'))
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if(DelGateWay == 0)
|
{
|
printf("input GateWay error!\n");
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
|
|
/* Clean out the RTREQ structure. */
|
memset((char *) &rt, 0, sizeof(struct rtentry));
|
memset((char *)&rtsockaddr,0,sizeof(struct sockaddr));
|
sinaddr = (struct sockaddr_in *)&rtsockaddr;
|
sinaddr->sin_family = AF_INET;
|
|
/*INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”*/
|
sinaddr->sin_addr.s_addr = INADDR_ANY;
|
|
/*set the destination address to '0.0.0.0'*/
|
rt.rt_dst = rtsockaddr;
|
|
/*set the netmask to '0.0.0.0'*/
|
rt.rt_genmask = rtsockaddr;
|
|
/* Fill in the other fields. */
|
rt.rt_flags = (RTF_UP|RTF_GATEWAY);
|
rt.rt_metric = 1;
|
rt.rt_dev = pInterface;
|
|
/*delete the current default gateway*/
|
sinaddr->sin_addr.s_addr = DelGateWay;
|
rt.rt_gateway = rtsockaddr;
|
|
|
if (0 > ioctl(sockfd, SIOCDELRT, &rt))
|
{
|
printf("Can't delete the current gateway\r\n");
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: AddGateWay
|
* Description: 增加指定的网关
|
* Input: pInterface :网络接口名字 如:eth0,NewGateWay:网关
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool AddGateWay(char *pInterface,unsigned int NewGateWay)
|
{
|
struct sockaddr_in *sinaddr;
|
struct rtentry rt;
|
struct sockaddr rtsockaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
if((pInterface == NULL)||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h'))
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if(NewGateWay == 0)
|
{
|
printf("input GateWay error!\n");
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
|
|
/* Clean out the RTREQ structure. */
|
memset((char *) &rt, 0, sizeof(struct rtentry));
|
memset((char *)&rtsockaddr,0,sizeof(struct sockaddr));
|
sinaddr = (struct sockaddr_in *)&rtsockaddr;
|
sinaddr->sin_family = AF_INET;
|
|
/*INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”*/
|
sinaddr->sin_addr.s_addr = INADDR_ANY;
|
|
/*set the destination address to '0.0.0.0'*/
|
rt.rt_dst = rtsockaddr;
|
|
/*set the netmask to '0.0.0.0'*/
|
rt.rt_genmask = rtsockaddr;
|
|
/* Fill in the other fields. */
|
rt.rt_flags = (RTF_UP|RTF_GATEWAY);
|
rt.rt_metric = 1;
|
rt.rt_dev = pInterface;
|
|
/*set the new default gateway*/
|
sinaddr->sin_addr.s_addr = NewGateWay;
|
rt.rt_gateway =rtsockaddr;
|
|
if (0 > ioctl(sockfd, SIOCADDRT, &rt))
|
{
|
printf("Can't set the new default gateway\r\n");
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
|
}
|
|
/**********************************************************************
|
* Function: SetGateWay
|
* Description: 设置网关,先删除已经有的,再添加新的
|
* Input: pInterface :网络接口名字 如:eth0,DelGateWay:删除的网关,
|
NewGateWay: 新添加的网关
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetGateWay(char *pInterface,const char* DelGateWay,const char* NewGateWay)
|
{
|
|
struct sockaddr_in *sinaddr;
|
struct rtentry rt;
|
struct sockaddr rtsockaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
if((pInterface == NULL)/*||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h')*/)
|
{
|
printf("input inteface error!\n");
|
return FALSE;
|
}
|
if((DelGateWay == NULL) && (NewGateWay == NULL))
|
{
|
printf("input GateWay error!\n");
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
}
|
|
|
/* Clean out the RTREQ structure. */
|
memset((char *) &rt, 0, sizeof(struct rtentry));
|
memset((char *)&rtsockaddr,0,sizeof(struct sockaddr));
|
sinaddr = (struct sockaddr_in *)&rtsockaddr;
|
sinaddr->sin_family = AF_INET;
|
|
/*INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”*/
|
sinaddr->sin_addr.s_addr = INADDR_ANY;
|
|
/*set the destination address to '0.0.0.0'*/
|
rt.rt_dst = rtsockaddr;
|
|
/*set the netmask to '0.0.0.0'*/
|
rt.rt_genmask = rtsockaddr;
|
|
/* Fill in the other fields. */
|
rt.rt_flags = (RTF_UP|RTF_GATEWAY);
|
rt.rt_metric = 1;
|
rt.rt_dev = pInterface;
|
|
/*delete the current default gateway*/
|
// sinaddr->sin_addr.s_addr = DelGateWay;
|
if(inet_aton(DelGateWay, &(sinaddr->sin_addr)) < 0)
|
{
|
printf("input ip address error\n");
|
return FALSE;
|
}
|
rt.rt_gateway = rtsockaddr;
|
|
|
if (0 > ioctl(sockfd, SIOCDELRT, &rt))
|
{
|
printf("Can't delete the current default gateway\r\n");
|
}
|
|
/*set the new default gateway*/
|
// sinaddr->sin_addr.s_addr = NewGateWay;
|
if(inet_aton(NewGateWay, &(sinaddr->sin_addr)) < 0)
|
{
|
printf("input ip address error\n");
|
return FALSE;
|
}
|
rt.rt_gateway =rtsockaddr;
|
|
if (0 > ioctl(sockfd, SIOCADDRT, &rt))
|
{
|
printf("Can't set the new default gateway\r\n");
|
}
|
|
close(sockfd);
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: GetMacAddress
|
* Description: 获得指定网口的物理MAC地质
|
* Input: ifaceName :网络接口名字 如:eth0,hwAddr:得到的mac地址
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool GetMacAddress (char* ifaceName, unsigned char* hwAddr)
|
{
|
int ret;
|
int sockfd;
|
struct ifreq ifr;
|
unsigned char temp_mac[6] = {0};
|
|
/* 判断接口输入是否正确 */
|
// if((ifaceName == NULL)||(ifaceName[0]!='e')||(ifaceName[1]!='t')||(ifaceName[2]!='h'))
|
// {
|
// printf("input inteface error!\n");
|
// return FALSE;
|
// }
|
|
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
|
if(sockfd < 0)
|
{
|
printf("Could not open test socket");
|
return FALSE;
|
}
|
|
memset(&ifr, 0, sizeof(ifr));
|
|
strncpy(ifr.ifr_name, ifaceName, IFACE_NAME_LENGTH);
|
|
if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0)
|
{
|
printf("failed to request hardware address for %s", ifaceName);
|
close(sockfd);
|
return FALSE;
|
}
|
|
int af = ifr.ifr_hwaddr.sa_family;
|
//int af = ifr.ifr_addr.sa_family;
|
|
memcpy(temp_mac, ifr.ifr_hwaddr.sa_data, MAC_ADDRESS_LEN);
|
sprintf((char *)hwAddr,"%02x:%02x:%02x:%02x:%02x:%02x", \
|
temp_mac[0], temp_mac[1], temp_mac[2], temp_mac[3], temp_mac[4], temp_mac[5]);
|
//memcpy(hwAddr, ifr.ifr_addr.sa_data, hwAddrSize);
|
|
return TRUE;
|
|
}
|
|
/**********************************************************************
|
* Function: GetIpAddress
|
* Description: 获得指定端口的ip地址
|
* Input: ifaceName :网络接口名字 如:eth0,IpAddress:得到的ip地址
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool GetIpAddress(char* ifaceName,unsigned char *IpAddress)
|
{
|
struct ifaddrs *ifaddr, *ifa;
|
struct ifreq ifr;
|
struct sockaddr_in *sinaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
// if((ifaceName == NULL)||(ifaceName[0]!='e')||(ifaceName[1]!='t')||(ifaceName[2]!='h'))
|
// {
|
// printf("input inteface error!\n");
|
// return FALSE;
|
// }
|
|
if(getifaddrs(&ifaddr) == -1)
|
{
|
printf("Could not get interface list");
|
freeifaddrs(ifaddr);
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
return FALSE;
|
}
|
|
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
|
{
|
if(!strcmp(ifaceName, ifa->ifa_name) && (ifa->ifa_addr->sa_family == AF_INET))
|
{
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)-1);
|
if (0 > ioctl(sockfd, SIOCGIFADDR, &ifr))
|
{
|
printf("Can't get ip address\r\n");
|
return FALSE;
|
}
|
sinaddr = (struct sockaddr_in *)&ifr.ifr_addr;
|
strcpy((char *)IpAddress,inet_ntoa(sinaddr->sin_addr));
|
freeifaddrs(ifaddr);
|
close(sockfd);
|
return TRUE;
|
|
}
|
|
}
|
|
printf("input interface no found\n");
|
|
freeifaddrs(ifaddr);
|
|
return FALSE;
|
}
|
|
/**********************************************************************
|
* Function: GetMaskAddress
|
* Description: 获得指定端口的子网掩码
|
* Input: pInterface :网络接口名字 如:eth0,MaskAddress:得到的子网掩码
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool GetMaskAddress(char* ifaceName,unsigned char *MaskAddress)
|
{
|
struct ifaddrs *ifaddr, *ifa;
|
struct ifreq ifr;
|
struct sockaddr_in *sinaddr;
|
int sockfd;
|
|
/* 判断接口输入是否正确 */
|
// if((ifaceName == NULL)||(ifaceName[0]!='e')||(ifaceName[1]!='t')||(ifaceName[2]!='h'))
|
// {
|
// printf("input inteface error!\n");
|
// return FALSE;
|
// }
|
|
if(getifaddrs(&ifaddr) == -1)
|
{
|
printf("Could not get interface list");
|
freeifaddrs(ifaddr);
|
return FALSE;
|
}
|
|
sockfd= socket(AF_INET,SOCK_DGRAM,0);
|
if (sockfd<0)
|
{
|
printf("Can't creat socket \r\n");
|
return FALSE;
|
}
|
|
|
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
|
{
|
if(!strcmp(ifaceName, ifa->ifa_name) && (ifa->ifa_addr->sa_family == AF_INET))
|
{
|
memset(&ifr, 0, sizeof(ifr));
|
strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)-1);
|
if (0 > ioctl(sockfd, SIOCGIFNETMASK, &ifr))
|
{
|
printf("Can't get ip address\r\n");
|
return FALSE;
|
}
|
sinaddr = (struct sockaddr_in *)&ifr.ifr_netmask;
|
// *MaskAddress = sinaddr->sin_addr.s_addr;
|
strcpy((char *)MaskAddress,inet_ntoa(sinaddr->sin_addr));
|
freeifaddrs(ifaddr);
|
close(sockfd);
|
return TRUE;
|
}
|
}
|
|
printf("input interface no found\n");
|
freeifaddrs(ifaddr);
|
|
return FALSE;
|
}
|
|
/**********************************************************************
|
* Function: GetAddress
|
* Description: 获得指定网口的sockdaddr地址
|
* Input: ifaceName :网络接口名字 如:eth0,addr:地址
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool GetAddress(char* ifaceName,struct sockaddr* addr)
|
{
|
struct ifaddrs *ifaddr, *ifa;
|
|
/* 判断接口输入是否正确 */
|
// if((ifaceName == NULL)||(ifaceName[0]!='e')||(ifaceName[1]!='t')||(ifaceName[2]!='h'))
|
// {
|
// printf("input inteface error!\n");
|
// return FALSE;
|
// }
|
|
if(getifaddrs(&ifaddr) == -1)
|
{
|
printf("Could not get interface list");
|
freeifaddrs(ifaddr);
|
return FALSE;
|
}
|
|
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
|
{
|
|
if(!strcmp(ifaceName, ifa->ifa_name) && (ifa->ifa_addr->sa_family == AF_INET))
|
{
|
memcpy(addr, ifa->ifa_addr, sizeof(struct sockaddr));
|
freeifaddrs(ifaddr);
|
return TRUE;
|
|
}
|
|
}
|
|
printf("input interface no found\n");
|
freeifaddrs(ifaddr);
|
return FALSE;
|
}
|
|
|
/**********************************************************************
|
* Function: GetGateWay
|
* Description: 得到默认网关
|
* Input: pInterface :网络接口名字 如:eth0,pGateWay:得到的网关
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool GetGateWay(char *pInterface,unsigned char *pGateWay)
|
{
|
short i = 0;
|
char buff[1024], iface[16];
|
char gate_addr[128], net_addr[128];
|
char mask_addr[128];
|
int num, iflags, metric, refcnt, use, mss, window, irtt;
|
|
char *sp , *bp;
|
unsigned int val=0;
|
|
/* 判断接口输入是否正确 */
|
// if((pInterface == NULL)||(pInterface[0]!='e')||(pInterface[1]!='t')||(pInterface[2]!='h'))
|
// {
|
// printf("input inteface error!\n");
|
// return FALSE;
|
// }
|
if(pGateWay == NULL)
|
{
|
printf("input mac address error\n");
|
return FALSE;
|
}
|
|
FILE *fp = fopen(PATH_PROCNET_ROUTE, "r");
|
|
while (fgets(buff, 1023, fp))
|
{
|
num = sscanf(buff, "%16s %128s %128s %X %d %d %d %128s %d %d %d\n",
|
iface, net_addr, gate_addr,
|
&iflags, &refcnt, &use, &metric, mask_addr,
|
&mss, &window, &irtt);
|
if (num < 10 || !(iflags & RTF_UP))
|
continue;
|
if(strncmp(iface,pInterface,4)!=0)
|
continue;
|
if(strncmp(net_addr,"00000000",8)!=0)
|
continue;
|
if(strncmp(mask_addr,"00000000",8)!=0)
|
continue;
|
bp = (char *) &val;
|
|
sp = gate_addr;
|
for (i = 0; i < 4; i++)
|
{
|
*sp = toupper(*sp);
|
if ((*sp >= 'A') && (*sp <= 'F'))
|
bp[i] |= (int) (*sp - 'A') + 10;
|
else if ((*sp >= '0') && (*sp <= '9'))
|
bp[i] |= (int) (*sp - '0');
|
else
|
{
|
printf("Can't convert the gateway string to integer.\n\r");
|
fclose(fp);
|
return 0;
|
}
|
bp[i] <<= 4;
|
sp++;
|
*sp = toupper(*sp);
|
|
if ((*sp >= 'A') && (*sp <= 'F'))
|
bp[i] |= (int) (*sp - 'A') + 10;
|
else if ((*sp >= '0') && (*sp <= '9'))
|
bp[i] |= (int) (*sp - '0');
|
else
|
{
|
printf("Can't convert the gateway string to integer.\n");
|
fclose(fp);
|
return 0;
|
}
|
sp++;
|
}
|
}
|
|
if(val == 0)
|
{
|
printf("Don't find default gateway = %d\n",val);
|
fclose(fp);
|
return FALSE;
|
}
|
else
|
{
|
// *pGateWay = htonl(val);
|
sprintf((char *)pGateWay,"%d.%d.%d.%d", (val>>24)&0xFF, (val>>16)&0xFF, (val>>8)&0xFF,val&0xFF);
|
}
|
|
|
fclose(fp);
|
return TRUE;
|
}
|
|
|
/**********************************************************************
|
* Function: SetSock_reUse
|
* Description: 设置网络套接字重复使用
|
* Input: sockfd:网络套接字
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetSock_reUse(int sockfd)
|
{
|
int reuse = 1;
|
if(-1 == setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)))
|
{
|
printf("setsockopt fail!\n");
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: SetSock_NoCheck
|
* Description: 设置套接字数据包不检测
|
* Input: sockfd:网络套接字
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetSock_NoCheck(int sockfd)
|
{
|
int nocheck = 1;
|
if(0 != setsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &nocheck, sizeof(int)))
|
{
|
printf("setsockopt NO_CHECK error!\n");
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: SetMutiCastLoop
|
* Description: 设置回环多播
|
* Input: sockfd:socket套接字,val:0 关闭,1 打开
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetMutiCastLoop(int sockfd,int val)
|
{
|
if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(int))< 0)
|
{
|
printf("failed to set multicast LOOP value \n");
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: SetMutiCastTTl
|
* Description: 设置多播地址组数据包的生存时间
|
* Input: sockfd:socket套接字,ttl,生存时间
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool SetMutiCastTTl(int sockfd,int ttl)
|
{
|
if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))< 0)
|
{
|
printf("failed to set multicast TTL value \n");
|
return FALSE;
|
}
|
return TRUE;
|
}
|
|
bool BindSockDevice(unsigned char*ifaceNmae,int sockfd)
|
{
|
struct ifreq ifreg;
|
strncpy(ifreg.ifr_name, (const char*)ifaceNmae,IFNAMSIZ);
|
if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&ifreg, sizeof(ifreg)) < 0)
|
{
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: AddIpAddr_ToMultiCast
|
* Description: 将指定ip地址添加入多播组
|
* Input: sockfd:socket套接字,ip:ip地址,multi_ip:多播地址,ttl:生存时间
|
* Return: 成功 1,失败 0
|
* Others:
|
**********************************************************************/
|
bool AddIpAddr_ToMultiCast(int sockfd,unsigned int ip,unsigned int multi_ip,int ttl)
|
{
|
struct ip_mreq imr;
|
|
imr.imr_multiaddr.s_addr = multi_ip;
|
imr.imr_interface.s_addr = ip;
|
|
if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, &imr.imr_interface.s_addr, sizeof(struct in_addr)) < 0)
|
{
|
printf("failed to set multicast send interface\n");
|
return FALSE;
|
}
|
|
if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr))< 0)
|
{
|
printf("failed to add multicast member\n");
|
return FALSE;
|
}
|
if(SetMutiCastTTl(sockfd,ttl) == FALSE)
|
{
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
/**********************************************************************
|
* Function: DisplayInterfaceStatus
|
* Description: 显示当前接口状态信息
|
* Input: ifaceName :网络接口名字 如:eth0
|
* Return: void
|
* Others:
|
**********************************************************************/
|
void DisplayInterfaceStatus(char* ifaceName)
|
{
|
int sockfd;
|
struct ifreq ifr;
|
struct ifaddrs *ifaddr, *ifa;
|
unsigned int flags;
|
|
|
if((ifaceName == NULL)||(ifaceName[0]!='e')||(ifaceName[1]!='t')||(ifaceName[2]!='h'))
|
{
|
printf("input inteface error!\n");
|
return;
|
}
|
|
if(getifaddrs(&ifaddr) == -1)
|
{
|
printf("Could not get interface list");
|
freeifaddrs(ifaddr);
|
return;
|
}
|
|
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
|
{
|
|
if(!strcmp(ifaceName, ifa->ifa_name))
|
{
|
flags = ifa->ifa_flags;
|
freeifaddrs(ifaddr);
|
}
|
|
}
|
if(flags & IFF_UP)
|
{
|
printf("Interface %s is up \n",ifaceName);
|
}
|
if(flags & IFF_RUNNING)
|
{
|
printf("Interface %s is running ",ifaceName);
|
}
|
|
}
|