/*
  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地址,并探测是否可达的更多相关文章

  1. vc根据域名获取IP地址 gethostbyname()函数

    以下是VC Socket初始化时用到的两个函数 一.WSAStartup函数                int WSAStartup                       (         ...

  2. iOS根据域名获取ip地址

    引入头文件 #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> //根据域名获取ip ...

  3. linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

    用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...

  4. C# 根据域名获取IP地址

    今天做海康微视视频接口的时候要用到硬盘录像机的IP地址.端口号.用户名和密码. 但是发现客户IP地址是动态获取的,经常变化. 所以需要根据域名解析出IP. 代码如下 //判断输入的是否是IP Rege ...

  5. 根据域名获取ip地址

    1如何查询网站域名对应的ip地址在电脑左下角搜索cmd ,在命令提示符中输入 ping www.pm25.in在电脑左下角搜索运行,输入cmd ,在命令提示符中输入 ping www.pm25.in得 ...

  6. C++通过域名获取IP地址的方法;调试通过!

    BOOL GetIpByDomainName(][],int *nCount) { WSADATA wsaData; ]; HOSTENT *pHostEnt; ; struct sockaddr_i ...

  7. 根据域名获取ip地址gethostbyname

    #include <sys/socket.h> #include <stdio.h> #include <netdb.h> int main(int argc, c ...

  8. Java如何根据主机名(域名)获取IP地址?

    在Java编程中,如何根据主机名(域名)获取IP地址? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将主机名更改为指定的IP地址. pac ...

  9. 获取 IP 地址

    package j2se.core.net.base; import java.net.InetAddress;import java.net.UnknownHostException; public ...

随机推荐

  1. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  2. 二模 (6) day1

    第一题: 设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4.如果一个正整数 x满足 S(x*x)=S(x)*S(x),我们称 x 为 Rabbit Nu ...

  3. 数据结构-List

    Lis的实现: /////////////////////////////////////////////////////////////////////////////// // // FileNa ...

  4. Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  5. c#读取文本文档实践2-计算商品价格

    商品 数量 单价英语 66 100语文 66 80数学 66 100化学 66 40物理 66 60 上面是文本文档中读入的数据. using System; using System.Collect ...

  6. checkbox的全选、反选、删除(适配器)

    package com.example.adapter; import java.util.List; import com.example.ay.R;import com.example.vo.Fl ...

  7. Iterator和ListIterator的区别

    Iterator是ListIterator的父接口. Iterator是Collection中取元素的方式,ListIterator局限于List Iterator只有hasNext(),next() ...

  8. Servlet三种实现方法(四)

    开发Servlet有三种方式:1.实现Servlet接口2.通过继承GenericServlet3.通过继承HttpServlet 一.实现Servlet接口 需求如下:请使用实现 接口的方式,来开发 ...

  9. c++形参和实参同名时,如何单步执行观察形参的变化。

    c++形参和实参同名时,如何单步执行观察形参的变化? 方法:当程序运行到函数中时,添加变量观察即可.

  10. Ubuntu安装Fcitx(小企鹅五笔输入法)

    安装配置如下: 1. 安装 fcitx sudo apt-get install fcitx 2. 配置默认输入法为 fcitx im-switch -s fcitx // 注意无须加 sudo 3. ...