zoukankan      html  css  js  c++  java
  • MyTtcp 测试网络带宽

    网络编程学习

    注意的指标
    MB/S 带宽
    每秒处理的信息 查询等 messages/s queries/s transaction/s
    延时
    cpu使用率


    ttcp测试网络 读写读写 循环 测试网络带宽

    正确关闭TCP shutdown_write read->0 closesocket

    TCP_NODELAY 延时发送小数据包 认为设置 不等待 即时发送 开启

    reuseaddr socket复用

     

    完整代码见

    https://git.oschina.net/def/cppPratice/tree/master/MyTtcpV0.1

    #include "RecvMessageLoop.h"
    
    
    #include <boost/asio.hpp>
    
    #include <iostream>
    
    #include <chrono>
    
    #include "Common.h"
    
    
    
    using boost::asio::ip::tcp;
    
    
    void RecvMessageLoop(const std::string& ipStr,
    	const std::string& portStr, const std::string& MessageBlockLen) {
    	//std::cout << "RecvMessageLoop" << std::endl;
    
    	boost::asio::io_service io_service;
    
    	tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), std::atoi(portStr.c_str())));
    
    	tcp::socket socket(io_service);
    	acceptor.accept(socket);
    
    	//SetSocketNoDelay(socket,true);
    
    
    
    	boost::system::error_code ec;
    	long recvBlocklen = 0;
    
    	size_t len = socket.read_some(boost::asio::buffer(&recvBlocklen,sizeof(recvBlocklen)), ec);
    	if (len != sizeof(recvBlocklen) || ec) {
    		PRINTERRORCODE(ec);
    		return;
    	}
    	
    	std::cout << "recvlen is: " << recvBlocklen << std::endl;
    
    	int testLoopTimes = defaultSendLength / recvBlocklen;
    
    	len = boost::asio::write(socket,boost::asio::buffer(&testLoopTimes, sizeof(testLoopTimes)), ec);
    	if (len != sizeof(testLoopTimes) || ec) {
    		PRINTERRORCODE(ec);
    		return;
    	}
    
    	std::unique_ptr<char[]> testBuf(new char[recvBlocklen]);//ok
    	for (int i = 0; i < recvBlocklen; ++i)
    	{
    		testBuf[i] = '\0';
    	}
    
    	auto start = std::chrono::steady_clock::now();
    
    	while(1) {
    		len = boost::asio::read(socket,
    			boost::asio::buffer(testBuf.get(), recvBlocklen),ec);
    		if (ec == boost::asio::error::eof) {
    			break;
    		}else if (len != recvBlocklen || ec) {
    			PRINTERRORCODE(ec);
    			return;
    		}
    		//std::cout << "read success" << std::endl;
    
    		int i = len;
    
    		len = boost::asio::write(socket, boost::asio::buffer(&i, sizeof(i)), ec);
    		if (len != sizeof(i) || ec) {
    			PRINTERRORCODE(ec);
    			return;
    		}
    		//std::cout << "write success" << std::endl;
    
    	}
    
    	//socket.shutdown(boost::asio::socket_base::shutdown_send);
    
    	//len = boost::asio::read(socket,
    
    	//	boost::asio::buffer(&len, sizeof(len)), ec);
    
    	//socket.close();
    
    	auto end = std::chrono::steady_clock::now();
    
    	std::chrono::duration<double> diff = end - start;
    	std::cout << "=>Time Elapse " << diff.count() << " s" << std::endl;
    	std::cout << "Total Length is  " << defaultSendLength / 1024 / 1024 << "MB" << std::endl;
    	std::cout << "Speed is " << defaultSendLength / 1024 / 1024/ diff.count() << "MB" << std::endl;
    }
    

      

  • 相关阅读:
    非循环单链表节点的操作
    链表每一个节点的数据类型该如何表示
    链表的定义、确定一个链表需要几个参数?
    typedef的用法
    连续存储数组的算法(包含数组倒置、冒泡排序……)
    跨函数使用内存案例
    malloc()动态分配内存概述
    结构体
    指针和数组
    C#基础知识之dnSpy反编译
  • 原文地址:https://www.cnblogs.com/itdef/p/6219170.html
Copyright © 2011-2022 走看看