在Linux下如果要使用接口标志要加什么头文件吗?因为我在使用IFF_UP时会出错,说是未定义

在Linux下如果要使用接口标志要加什么头文件吗?因为我在使用IFF_UP时会出错,说是未定义,第1张

头文件一般放在/usr/include目录下,锋搭

用grep 'IFF_UP' /usr/include/银橡拿*.* |less

这个命令查找一下在哪如宴个头文件里面有定义。

需要导入的头文件:

#define IOS_CELLULAR    @"pdp_ip0"

#define IOS_WIFI        @"en0"

#define IOS_VPN        @"utun0"

#define IP_ADDR_IPv4    @"ipv4"

#define IP_ADDR_IPv6    @"ipv6"

#include <sys/socket.h>

#include <sys/sysctl.h>

#include <net/if.h>

#include <net/if_dl.h>

实现:

- (NSString *)getIPAddress:(BOOL)preferIPv4

{

NSArray *searchArray = preferIPv4 ?

@[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :

@[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ]

NSDictionary *addresses = [self getIPAddresses]

//    NSLog(@"addresses: %@", addresses)

__block NSString *address

[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)

{

address = addresses[key]

//筛皮大尘选出IP地址格燃禅式

if([self isValidatIP:address]) *stop = YES

} ]

return address ? address : @"0.0.0.0"

}

//  判断是不是ip地址格式

- (BOOL)isValidatIP:(NSString *)ipAddress {

if (ipAddress.length == 0) {

return NO

}

NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."

"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."

"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."

"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"

NSError *error

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error]

if (regex != nil) {

NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])]

if (firstMatch) {

//   仿做         NSRange resultRange = [firstMatch rangeAtIndex:0]

//            NSString *result=[ipAddress substringWithRange:resultRange]

//            NSLog(@"result==%@",result)

return YES

}

}

return NO

}

- (NSDictionary *)getIPAddresses

{

NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8]

// retrieve the current interfaces - returns 0 on success

struct ifaddrs *interfaces

if(!getifaddrs(&interfaces)) {

// Loop through linked list of interfaces

struct ifaddrs *interface

for(interface=interfacesinterfaceinterface=interface->ifa_next) {

if(!(interface->ifa_flags &IFF_UP) /* || (interface->ifa_flags &IFF_LOOPBACK) */ ) {

continue// deeply nested code harder to read

}

const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr

char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ]

if(addr &&(addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {

NSString *name = [NSString stringWithUTF8String:interface->ifa_name]

NSString *type

if(addr->sin_family == AF_INET) {

if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {

type = IP_ADDR_IPv4

}

} else {

const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr

if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {

type = IP_ADDR_IPv6

}

}

if(type) {

NSString *key = [NSString stringWithFormat:@"%@/%@", name, type]

addresses[key] = [NSString stringWithUTF8String:addrBuf]

}

}

}

freeifaddrs(interfaces)

}

return [addresses count] ? addresses : nil

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12322985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存