14.5.27以来。谷歌又打不开了。

从网上找了些国内的googleserverIP,例如以下:

const char* g_google_ips[18] = {
"203.208.48.151", "203.208.46.176", "203.208.46.147",
"203.208.46.212", "203.208.46.158", "203.208.46.180",
"203.208.46.198", "203.208.41.150", "203.208.41.151",
"203.208.41.135", "203.208.41.142", "203.116.165.221",
"203.116.165.224", "203.116.165.235", "203.116.165.207",
"203.116.165.223", "203.116.165.231", "203.116.165.160",
};

但每次手动选择一个IP来打开的话,还不知道他速度好不好,所以我做了这么个小程序analyse.exe:

依次ping每一个IP,计算其响应时间,选取最快的一个,写入一个bat文件。内容为:

sprintf(cmd, "start explorer http://%s", g_google_ips[fastest_ndx]);

使用exporer会用ie来打开谷歌站点。

explorer能够替换为自己的浏览器路径或名称,如chrome。

直接执行这个批处理文件就可以打开google站点。下次感觉这个IP变卡了,能够再次执行一下analyse.exe。

完整源码例如以下:

typedef struct icmp_hdr
{
unsigned char icmp_type; // 消息类型
unsigned char icmp_code; // 代码
unsigned short icmp_checksum; // 校验和
// 以下是回显头
unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID
unsigned short icmp_sequence; // 序列号
unsigned long icmp_timestamp; // 时间戳
} ICMP_HDR, *PICMP_HDR; const char* g_google_ips[18] = {
"203.208.48.151", "203.208.46.176", "203.208.46.147",
"203.208.46.212", "203.208.46.158", "203.208.46.180",
"203.208.46.198", "203.208.41.150", "203.208.41.151",
"203.208.41.135", "203.208.41.142", "203.116.165.221",
"203.116.165.224", "203.116.165.235", "203.116.165.207",
"203.116.165.223", "203.116.165.231", "203.116.165.160",
}; USHORT checksum(USHORT* buff, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buff++;
size -= sizeof(USHORT);
}
// 是奇数
if(size)
{
cksum += *(UCHAR*)buff;
}
// 将32位的chsum高16位和低16位相加。然后取反
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
} BOOL SetTimeout(SOCKET s, int nTime, BOOL bRecv)
{
int ret = ::setsockopt(s, SOL_SOCKET,
bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
return ret != SOCKET_ERROR;
} int ping(const char* dst_ip)
{
SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); SetTimeout(sRaw, 1000, TRUE); SOCKADDR_IN dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(0);
dest.sin_addr.S_un.S_addr = inet_addr(dst_ip); // 创建ICMP封包
char buff[sizeof(ICMP_HDR) + 32];
ICMP_HDR* pIcmp = (ICMP_HDR*)buff;
pIcmp->icmp_type = 8; // 请求一个ICMP回显
pIcmp->icmp_code = 0;
pIcmp->icmp_id = (USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum = 0;
pIcmp->icmp_sequence = 0;
memset(&buff[sizeof(ICMP_HDR)], 'E', 32); USHORT nSeq = 0;
char recvBuf[1024];
SOCKADDR_IN from;
int nLen = sizeof(from);
int avr_time = 0;
int nCount = 0;
while(TRUE)
{
int nRet;
if(nCount++ == 4)
break;
pIcmp->icmp_checksum = 0;
pIcmp->icmp_timestamp = ::GetTickCount();
pIcmp->icmp_sequence = nSeq++;
pIcmp->icmp_checksum = checksum((USHORT*)buff, sizeof(ICMP_HDR) + 32);
nRet = ::sendto(sRaw, buff, sizeof(ICMP_HDR) + 32, 0,
(SOCKADDR *)&dest, sizeof(dest));
if(nRet == SOCKET_ERROR)
{
printf(" sendto() failed: %d \n", ::WSAGetLastError());
return -1;
}
nRet = ::recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&from, &nLen);
if(nRet == SOCKET_ERROR)
{
if(::WSAGetLastError() == WSAETIMEDOUT)
{
printf(" timed out\n");
continue;
}
printf(" recvfrom() failed: %d\n", ::WSAGetLastError());
return -1;
} int nTick = ::GetTickCount();
if(nRet < sizeof(IPHeader) + sizeof(ICMP_HDR))
{
printf(" Too few bytes from %s \n", ::inet_ntoa(from.sin_addr));
} ICMP_HDR* pRecvIcmp = (ICMP_HDR*)(recvBuf + 20); // (ICMP_HDR*)(recvBuf + sizeof(IPHeader));
if(pRecvIcmp->icmp_type != 0) // 回显
{
printf(" nonecho type %d recvd \n", pRecvIcmp->icmp_type);
return -1;
} if(pRecvIcmp->icmp_id != ::GetCurrentProcessId())
{
printf(" someone else's packet! \n");
return -1;
} printf(" %d bytes from %s:", nRet, inet_ntoa(from.sin_addr));
printf(" icmp_seq = %d. ", pRecvIcmp->icmp_sequence);
printf(" time: %d ms", nTick - pRecvIcmp->icmp_timestamp);
avr_time += nTick - pRecvIcmp->icmp_timestamp;
printf(" \n"); ::Sleep(1000);
}
::closesocket(sRaw);
avr_time /= 4;
return avr_time;
}<pre code_snippet_id="385396" snippet_file_name="blog_20140610_3_201928" name="code" class="cpp">
int main()
{
static const int MAX_NUM = 18;
int ret_times[MAX_NUM] = {0};
int min_ret = 1000;
int fastest_ndx = 0;
printf("start analyze the speed of google's ips.\n");
for(int i = 0; i < MAX_NUM; i++)
{
printf("ping %s\n", g_google_ips[i]);
ret_times[i] = ping(g_google_ips[i]);
if(ret_times[i] != -1 && min_ret > ret_times[i])
{
min_ret = ret_times[i];
fastest_ndx = i;
}
printf("average time from %s is %d ms.\n\n",
g_google_ips[i], ret_times[i]);
} printf("analyze over, fastest google ip is %s, average time %d ms.\n",
g_google_ips[fastest_ndx], min_ret);
const char* file_name = "google.bat";
char cmd[1024] = {0};
sprintf(cmd, "start explorer http://%s", g_google_ips[fastest_ndx]);
::DeleteFile(file_name);
FILE* file = NULL;
file = fopen(file_name, "wb");
if(file)
{
fwrite(cmd, 1, strlen(cmd), file);
fclose(file);
printf("now you can run google.bat to open the fastest www.google.com!\n");
}
return 0;
}



google打不开解决的方法的更多相关文章

  1. IE浏览器打不开解决的方法

    windows 7和windows 8上的IE浏览器打不开.非常可能是权限问题,解决的方法: 点击"開始"-"执行",输入"regedit" ...

  2. 谷歌google搜索打不开、谷歌gmail邮箱及相关服务无法登录的解决的方法

    歌打不开 google打不开,与中国大陆封杀有关,可是主要是由于近期googleserver在全球范围内又一次进行了布局调整. 解决的方法是仅仅要改动用户本地计算机hosts文件就能够了. 一.Win ...

  3. 北邮iptv用WindowsMediaplayer打不开的解决的方法

    前言:之前我的iptv能够用,可是有次我安装了realplayer,它就偷偷把iptv文件的默认打开方式给篡改了,卸载了                  realplayer之后,iptv不能直接用 ...

  4. 在字符串资源文件里加入HTML元素,直接使用字符串资源,HTML元素没起作用的解决的方法

    escape  html  in string resource 一. 需求描写叙述 给TextView赋值res资源库中的字符串资源,注意这里是一个string资源,要实现以下的效果 "未 ...

  5. Rhythmbox中文乱码解决的方法

    转自:http://hi.baidu.com/morgensonne/item/3470aef58747abde6325d2d9 今天在网络上找到了一个比較好的解决Rhythmbox中文乱码的问题的方 ...

  6. Rhythmbox乱码的解决的方法

    近期尝试 Listen 和 Banshee 才发现,Rhythmbox 上出现的 mp3乱码问题依然,并且更加严重,想要彻底弄清和解决必须搞清两点,第一, mp3 标签类型和编码,第二,各种播放器对 ...

  7. Android Eclipseproject开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决的方法

    android.os.NetworkOnMainThreadException 异常的解决的方法. 刚开是把HttpURLConnectionnection 打开连接这种方法放在UI线程里了,可能不是 ...

  8. Chrome 对于 glyphicon 字体图标不显示的解决的方法

    在将Chome默认字体渲染为微软雅黑后,部分字体图标显示为方框,这里Chome扩展文档提供的解决的方法为: 找到  custom.css 文件,路径为: C:\Users\(username)\App ...

  9. Android Studio关于USB device not found的解决的方法

    Android Studio关于USB device not found的解决的方法 我们使用Android Studio进行Android开发时.当我们使用真机进行调试时.非常可能会出现USB de ...

随机推荐

  1. WIN7 下面 装XP

    WIN7 下面1.解压 GHOST.ISO2.点里面的 安装系统3.进入 DOS GHOST 界面,进行GHOST系统到自已指定的XP分区4.开始安装XP5.安装完毕后,打开 dbr-1.2.0.0. ...

  2. C# 中的动态创建技术

    [转载]原文出处  http://blog.csdn.net/baiyun789/article/details/6156694 第一部分 WinForm控件在窗体中动态居中创建.删除控件及对其赋值 ...

  3. FT项目开发技术点(二)

    1.mybatis二级缓存,指的的是将数据缓存,而非对象,而非获得的list.缓存将数据库中的数据,是数据,缓存到内存中.之后将数据每次重新加载到list中,所以每次生成的list对象都是不同的,li ...

  4. 【docker】 docker容器内部安装vi命令

    有时会需要在docker容器内使用vi命令,但是新启动的docker容器内并没有vi命令,那就需要自己安装一个 1.使用命令 apt-get update 2.进行安装 apt-get install ...

  5. EF实体框架处理实体之间关联关系与EF延迟机制(下)

    在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...

  6. 配置quartz数据源的三种方式

    如果是使用了JDBC JobStore或JobStoreCMT获得持久的Job时,就要配置相关的数据源了. 方式一:使用quartz.properties文件,这时只需要在property文件中增加如 ...

  7. windows tomcat nginx session(当一台tomcat关闭后)

    在windows下作nginx负载均衡测试. nginx的配置文件如下: worker_processes  1; events { worker_connections  1024; } http ...

  8. JSONString 与 JSONData 与字典或者数组互相转化

    JSON JSON相关的,数据彼此间的转化进行了简单地封装,源码如下,支持arc与非arc YXJSON.h + YXJSON.m // // YXJSON.h // // JSONString 与 ...

  9. RUP

    RUP随想 [摘要] 本文主要阐述一下我对RUP软件工程思想的看法以及一些感想.我认为软件工程既然是工程,那么纯粹的空谈理论是没有意义的,软件工程需要实干.我认为软件工程的思想实际上和兵法理论是一样的 ...

  10. Logging with PSR-3 to Improve Reusability

    可以用composer的autoload来,导入自己写的类库.   composer dump-autoload -o  ----------------> 改成 composer update ...