根据域名获取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 ...
随机推荐
- Xcode连接git@osc
Xcode 已经集成了git,建立新项目时钩选使用git,然后按照下面步骤让Xcode和git@osc 建立连接. 第一步:成生SSH密钥 打开终端命令工具,输入命令:ssh-keygen -t rs ...
- $where $options: 'g','i'
db.classes.update({"count":{$gt:20}},{$set:{"name":"c4"}},false,false) ...
- NOIP2013 提高组day2 3 华容道 BFS
描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...
- KING小组
KING——学习小组 小组成员及github地址&博客地址: 张静 https://github.com/loiskris/test.git http://www.cnblogs.com/l ...
- redis2.8--c/s架构流程
- Spring学习笔记之初始化和销毁方法的调用次序
Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, a ...
- Java内存模型---并发编程网 - ifeve.com
Java内存模型 转自:http://ifeve.com/java-memory-model-6/ 原文地址 作者:Jakob Jenkov 译者:张坤 Java内存模型规范了Java虚拟机与计算机 ...
- combox源码解析
/** * jQuery EasyUI 1.3.2 * * Copyright (c) 2009-2013 www.jeasyui.com. All rights reserved. * * Lice ...
- 控制台应用程序中Main函数的args参数
在VS中添加参数 菜单 项目 -- 你的项目属性 -- 调试 -- 启动选项 -- 命令行参数 参数之间用空格分隔开就可以了,如果参数有空格,以双引号风格
- 永不消逝的电波(三):低功耗蓝牙(BLE)入门之如何调戏别人的小米手环
0×00 前言 蓝牙(Bluetooth),一种无线技术标准,用来让固定与移动设备,在短距离间交换数据,以形成个人局域网(PAN).其使用短波特高频(UHF)无线电波,经由2.4至2.485 GHz的 ...