文档章节

简易的网速测试

梦想游戏人
 梦想游戏人
发布于 2016/08/28 20:16
字数 428
阅读 31
收藏 0

基本原理是访问稳定的网页来测试速度,或者利用稳定的下载地址来测速,比如QQ.EXE

网页粒度小 测试没有 下载地址 稳定准确

界面MFC完成,网络API使用CURL

HttpClient.cpp

#include "stdafx.h"

#include"HttpClient.h"
#include "HttpRequest.h"
#include "HttpRespone.h"
#include "curl.h"
#include <stdio.h>
#include <iostream>

using namespace std;

static int write_data(void *buffer, size_t size, size_t buffer_size, void *_respone)
{

	HttpRespone *respone = (HttpRespone*)_respone;


	HttpRequest*request = respone->getHttpRequest();

	respone->writeData(buffer, buffer_size);

	//request->release();

		const HttpCallBack & x = request->getHttpCallback();

		x(request, respone);
	return buffer_size;
}


HttpClient* HttpClient::getInstance()
{
	static HttpClient*ins = nullptr;
	if (ins == nullptr)
	{
		ins = new HttpClient;
	}
	return ins;

}

void HttpClient::doRequest_curl(HttpRequest*request)
{

	HttpRespone *respone = HttpRespone::create();
	CURL*easy_handle = curl_easy_init();
	curl_easy_setopt(easy_handle, CURLOPT_URL, request->getUrl().c_str());
	curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);
	curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, respone);

	respone->setHttpRequest(request);
	request->setCURLhandle(easy_handle);

	// perform
	auto succ = curl_easy_perform(easy_handle);


}


void HttpClient::workFunc()
{
	while (true)
	{
		HttpRequest* request;

		_mutex.lock();

		if (_queue_request.size() <= 0)
		{
			_condition.wait(_mutex);
		}
		request = _queue_request.front();
		_queue_request.pop();
		_mutex.unlock();

		//	log("net thread  %d", _queue_request.size());

		this->doRequest_curl(request);


	}

}

void  HttpClient::setTimeoutForConnect(int t)
{
	this->_time_connect = t;
}

void  HttpClient::setTimeoutForRead(int t)
{
	this->_time_read = t;
}


HttpClient::HttpClient()
{
	this->_time_connect = 5;
	this->_time_read = 10;
	curl_global_init(CURL_GLOBAL_WIN32);

	/*auto t = std::thread([=]
	{
		this->workFunc();
	});
	t.detach();
	*/
}



void HttpClient::send(HttpRequest*request)
{
//	request->retain();
/*	_mutex.lock();
	_queue_request.push(request);
	_mutex.unlock();

	_condition.notify_one();
	*/
	this->doRequest_curl(request);
}

HttpClient::~HttpClient()
{
	_condition.notify_all();
}

 

按钮响应事件



	int total = 0;
	int max = 0;
	int min = 0xffffff;

	char s[500];

	for (int i = 0; i < 10; i++)
	{
		int sp = download();

		total += sp;
		sprintf(s, "%d KB/s", sp);

		_txt_current.SetWindowTextW(toUnicode(s));
		_size_total = 0;

		sprintf(s, "%d KB/s", total / (i + 1));

		_txt_total.SetWindowTextW(toUnicode(s));

		if (sp > max)
		{
			max = sp;
			sprintf(s, "%d KB/s", max);
			_txt_max.SetWindowTextW(toUnicode(s));
		}

		if (sp < min)
		{
			min = sp;
			sprintf(s, "%d KB/s", min);
			_txt_min.SetWindowTextW(toUnicode(s));
		}
	}

	sprintf(s, "0 KB/s");
	_txt_current.SetWindowTextW(toUnicode(s));
	MessageBox(_T("测速完成"), _T("完成"), MB_OK);

 

download函数



static int download()
{
	CURL *curl;
	CURLcode res;
	struct FtpFile ftpfile = {
		"1.exe", 
		NULL
	};

	curl = curl_easy_init(); 

	int t = clock();

	if (curl) { 

		//http://www.winrar.com.cn/download/wrar531scp.exe

		curl_easy_setopt(curl, CURLOPT_URL, "http://www.qq.com");
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);,
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); 
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

		//	curl_easy_setopt(curl, CURLOPT_USERPWD, "SUREN:SUREN");

		t1 = clock();
		res = curl_easy_perform(curl);
		curl_easy_cleanup(curl);
	}

	if (ftpfile.stream)
	{
		fclose(ftpfile.stream);
	}

	//	log("1.txt", "     %d S   %d KB/S    %d KB", (clock() - t), _size_total/(clock() - t), _size_total / 1024);

	return _size_total / (clock() - t);

}

 

© 著作权归作者所有

上一篇: 笔试题-单词反转
下一篇: 线程栈
梦想游戏人
粉丝 38
博文 445
码字总数 127977
作品 0
成都
私信 提问
常用网络诊断工具

http://ce.cloud.360.cn/task 网速测试工具 ping : 对目标IP探活,测试网络连通性和质量 traceroute : 探测到达目标IP所经过的路由节点及其网络质量 nmap:对目标IP进行多协议,多功能的网络...

ipandage
2014/11/18
21
0
如何在Linux的终端测试网速

学习如何在 Linux 终端使用命令行工具 测试网速,或者仅用一条 python 命令立刻获得网速的测试结果。 我们都会在连接到一个新的网络或者 WIFI 的时候去测试网络带宽。 为什么不用我们自己的服...

作者: Shrikant Lavhate
2018/04/19
0
0
央视《每周质量报告》:揭秘假宽带真相

[导读]有关报告指出,国内超半数用户实际宽带下载速率低于运营商提供的名义宽带速率,中国的宽带是“假宽带”。 用户在宽带升级后依然遭遇网速慢难题 我国宽带运营体系 DCCI报告称国内很多宽...

oschina
2012/10/07
3.7K
45
蓝天空工具箱官方版

蓝天空工具箱整合了系统维护、系统修复、休闲娱乐,功能强大,操作简单 、界面清爽、方便携带等一百多项实用功能、更为你封装系统增添一道亮丽的风景线。经大量朋友们在XP、win7x32系统的测试...

相心的泪
2016/08/17
4
0
speedtest-cli命令行下测试服务器外网速度

电脑测试网速这个功能估计大家都用过,但是服务器需要测试外网的速度相比大家做法各有不同,有的人使用自己的服务器来测试上下行速度,有些通过下载某个网站的资源来测试下行速度,鉴于这些节...

小运
2014/02/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql报错 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

CentOS 6.5 下安装配置 mysql 使用yum安装,具体过程参见最下边的参考文章。 安装之后启动失败: [root@localhost ~]# service mysqld startStarting mysqld: ...

BG2KNT
20分钟前
1
0
IOC的学习(1)

IOC IOC创建bean的4种方式: 无参构造器, 有参构造器,其中<constructor-arg>可以通过index="0"或者type="int"来指定构造方法参数。 静态工厂方法,factory-method。 普通工厂方法,需要指定......

太猪-YJ
33分钟前
1
0
tomcat 莫名奔溃问题

Apr 24, 2019 6:18:11 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8080"] Apr 24, 2019 6:18:12 PM org.apache.coyote.AbstractProtocol pause......

mellen
51分钟前
3
0
组件开发规范 class名身份识别

组件需要通过一个组件共有的class来标识这个组件,外部调用的时候,可以通过锁定这个class来方便地改变组件的css样式。 设置方式 .my-checkbox { width: 20px; height: 20px; font-...

Carbenson
59分钟前
3
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部