/****************************************************************************** * * ******************************************************************************* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "net_config.h" #include #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 #include 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); } }