本文目录一览:
- 1、获取网关IP地址
- 2、无法定位程序输入点inet_ntop于动态链接库WS2_32.DLL上
- 3、xp无法定位程序输入点inet_ntop于动态链接库ws2_32.dll
- 4、如何使用unix网络编程第三版的源码
- 5、gethostbyname 用法 ,高手一定要帮忙看看
获取网关IP地址
需要导入的头文件:
#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 ] :-inetntop头文件
@[ 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 ] ;-inetntop头文件
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];-inetntop头文件
if (regex != nil) {
NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];-inetntop头文件
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=interfaces; interface; interface=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;
}
无法定位程序输入点inet_ntop于动态链接库WS2_32.DLL上
无法定位程序输入点inet_ntop于动态链接库WS2_32.DLL上是因为相关的dll文件丢失造成的,能通过修复来处理。以金山毒霸为例,步骤如下:
1、直接在主页里面,点击百宝箱跳转。
2、下一步,需要选择电脑医生进入。
3、这个时候,继续搜索对象进行确定。
4、如果没问题,就立即修复。
5、这样一来等提示修复成功以后,即可达到目的了。
xp无法定位程序输入点inet_ntop于动态链接库ws2_32.dll
缺失ws2_32.dll文件造成,解决步骤如下:
1、首先,在一定途径获取ws2_32.dll文件,例如搜索引擎查询并下载。
2、其次,将ws2_32.dll文件复制到DLL目录“C:\Windows\System32”下。
3、点击“开始菜单”,选择“运行”按钮,输入:regsvr32 ws2_32.dll,点击确定。
4、此时弹出安装完成ws2_32.dll文件的提示,点击确定。
如何使用unix网络编程第三版的源码
unix网络编程书中所有代码都基于它提供的头文件和库。所以学习时要用书中的代码做练习就必须配置好他需要的环境。
首先到 ht tp:/ /ishare.iask.sin a.c om.c n/f/1323 85 21.ht m l?sudaref=blog.cs dn.netretcode=0 下载源码包-inetntop头文件
第一步:在终端中进入upnv13e目录,然后执行代码:
./configure
第二步:这里有问题及解决方法
cd lib
make(如果报如下错误: inet_ntop.c:61: error: argument 'size' doesn't match prototype
/usr/include/arpa/inet.h:153: error: prototype declaration-inetntop头文件
inet_ntop.c第61行 size_t size -改成 socklen_t size)
第三步:这一步没有问题
cd ../libfree
make
第四步:
cd ../libgai
make
cd .. //回到unpv13e目录
然后拷贝生成的ku到系统库目录:
sudo cp libunp.a /usr/lib
sudo cp libunp.a /usr/lib32
第五步:修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便
vim lib/unp.h
sudo cp lib/unp.h /usr/include
sudo cp config.h /usr/include
以后编译代码的时候加上-lunp链接我们的库。(貌似只能用gcc,不能用g++)
gethostbyname 用法 ,高手一定要帮忙看看
使用这个东西,首先要包含2个头文件:
#include netdb.h
#include sys/socket.h
struct hostent *gethostbyname(const char *name);
这个函数的传入值是域名或者主机名,例如"","wpc"等等。
传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
解释一下这个结构, 其中:
char *h_name 表示的是主机的规范名。例如的规范名其实是。
char **h_aliases 表示的是主机的别名。就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
int h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
int h_length 表示的是主机ip地址的长度
int **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。-inetntop头文件
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。
这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。
下面是例程,有详细的注释。
#include netdb.h
#include sys/socket.h
int main(int argc, char **argv)
{
char *ptr,**pptr;
struct hostent *hptr;
char str[32];
/* 取得命令后第一个参数,即要解析的域名或主机名 */
ptr = argv[1];
/* 调用gethostbyname()。调用结果都存在hptr中 */
if( (hptr = gethostbyname(ptr) ) == NULL )
{
printf("gethostbyname error for host:%s\n", ptr);
return 0; /* 如果调用gethostbyname发生错误,返回1 */
}
/* 将主机的规范名打出来 */
printf("official hostname:%s\n",hptr-h_name);
/* 主机可能有多个别名,将所有别名分别打出来 */
for(pptr = hptr-h_aliases; *pptr != NULL; pptr++)
printf(" alias:%s\n",*pptr);
/* 根据地址类型,将地址打出来 */
switch(hptr-h_addrtype)
{
case AF_INET:
case AF_INET6:
pptr=hptr-h_addr_list;
/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */
for(;*pptr!=NULL;pptr++)
printf(" address:%s\n", inet_ntop(hptr-h_addrtype, *pptr, str, sizeof(str)));
break;
default:
printf("unknown address type\n");
break;
}
return 0