根据域名获取IP地址,并探测是否可达
/*
Author :decwang@2014.09.01
Mail :deworks@sina.com
*/
#define PRINTLOG printf
//返回0表示成功,其他为失败.
int getIpAddressByGetAddrInfo(const char* address,char* realIP,int maxLen)
{
if (NULL == address || NULL == realIP)
{
PRINTLOG("param address wrong\n");
return -;
}
struct addrinfo *answer = NULL, hint, *curr = NULL;
bzero(&hint, sizeof(hint));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
int ret = getaddrinfo(address, NULL, &hint, &answer);
if (ret != )
{
PRINTLOG("error on getaddrinfo: ret: %s\n",gai_strerror(ret));
return -;
}
for (curr = answer; curr != NULL; curr = curr->ai_next)
{
inet_ntop(AF_INET,&(((struct sockaddr_in *)(curr->ai_addr))->sin_addr),realIP, maxLen);
PRINTLOG("realIP is %s\n", realIP);
break;
}
freeaddrinfo(answer);
return ;
}
//返回1表示网络可达,返回其他为失败
int isReachable(const char* address,int port,int timeout)
{
if (NULL == address)
{
PRINTLOG("param address wrong\n");
return -;
}
if (timeout <= )
{
PRINTLOG("param timeout wrong\n");
return -;
}
struct sockaddr_in server_addr;
char realIP[];
memset(realIP,,sizeof(realIP));
int nRet = getIpAddressByGetAddrInfo(address, realIP, -);
if (nRet != )
{
PRINTLOG("get real ip address failed\n");
return -;
}
if (port >= || port <= )
{
PRINTLOG("port invalid\n");
return -;
} int sockfd = socket(AF_INET, SOCK_STREAM, );
if(sockfd < )
{
PRINTLOG("create socket failed\n");
return -;
} memset(&server_addr, , sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(realIP); int error=-, len;
len = sizeof(int);
struct timeval tm;
fd_set set;
fcntl(sockfd, F_SETFL, O_NONBLOCK);
if( connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) ==-)
{
tm.tv_sec = timeout;
tm.tv_usec = ;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+, NULL, &set, NULL, &tm) > )
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == )
nRet = ;
else
nRet = ;
}
else
nRet = ;
}
else
nRet = ;
close( sockfd );
return nRet;
}
这段代码是为了修正之前的iOS上的双网络连接探测用的,之前的SCNetWork对网络的状态判断存在,故干脆采用直接连接的方式进行判断
根据域名获取IP地址,并探测是否可达的更多相关文章
- vc根据域名获取IP地址 gethostbyname()函数
以下是VC Socket初始化时用到的两个函数 一.WSAStartup函数 int WSAStartup ( ...
- iOS根据域名获取ip地址
引入头文件 #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> //根据域名获取ip ...
- linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换
用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...
- C# 根据域名获取IP地址
今天做海康微视视频接口的时候要用到硬盘录像机的IP地址.端口号.用户名和密码. 但是发现客户IP地址是动态获取的,经常变化. 所以需要根据域名解析出IP. 代码如下 //判断输入的是否是IP Rege ...
- 根据域名获取ip地址
1如何查询网站域名对应的ip地址在电脑左下角搜索cmd ,在命令提示符中输入 ping www.pm25.in在电脑左下角搜索运行,输入cmd ,在命令提示符中输入 ping www.pm25.in得 ...
- C++通过域名获取IP地址的方法;调试通过!
BOOL GetIpByDomainName(][],int *nCount) { WSADATA wsaData; ]; HOSTENT *pHostEnt; ; struct sockaddr_i ...
- 根据域名获取ip地址gethostbyname
#include <sys/socket.h> #include <stdio.h> #include <netdb.h> int main(int argc, c ...
- Java如何根据主机名(域名)获取IP地址?
在Java编程中,如何根据主机名(域名)获取IP地址? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将主机名更改为指定的IP地址. pac ...
- 获取 IP 地址
package j2se.core.net.base; import java.net.InetAddress;import java.net.UnknownHostException; public ...
随机推荐
- 北邮新生排位赛1解题报告d-e
话说cdsn要是前面插入源代码又什么都不放就会出现奇怪的源代码?不知道是哪个网页的 407. BLOCKS 时间限制 1000 ms 内存限制 65536 KB 题目描述 给定一个N∗M的矩阵,求问里 ...
- POJ 1850 Code 字符串 难度:1
题意: 1 如果是严格升序的字母字符串,那么可以输出非0解码,否则不能译码输出0 2 字符串解码 遵循递增原则,其值为 到现在为止的所有按字母序小于该字符串的数量 + 1; #include < ...
- checkbox全选功能
$("#cb_classType_all").change(function () { if ($(this).is(":checked")) { $(&quo ...
- wdcp升级php版本到5.3,5.5
官网省级方法 wget http://down.wdlinux.cn/in/php_up53.shsh php_up53.sh 看到"php update is OK"提示表示,顺 ...
- 设置AFNetworking网络请求的超时时间
http://www.mamicode.com/info-detail-511816.html // 设置超时时间 [manager.requestSerializer willChangeValue ...
- 开通了cnblogs
受够了百度空间,换个地方,或许会更好. 以后有机会会将百度空间你的文章搬过来的.
- [开发笔记]-获取歌曲ID3信息
ID3介绍: ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版. 获 ...
- zoj 2112 动态区间求第k大
题目大意: 动态单点更新,然后多次询问求区间内第k大 这里单个的主席树不能实现,这里采取的是树状数组套主席树 首先可以想的是将静态主席树先构建好,不去动它,这里空间复杂度就是O(nlogn),这个只要 ...
- [转] C中的位域
一.位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一 ...
- SSH(1)
假定服务器ip为192.168.1.139,ssh服务的端口号为22,服务器上有个用户为pi,两边都是ubuntu 一,Init *安装 如果是想用ssh从本机登陆别的机器,只需要安装openssh- ...