网络编程学习
注意的指标
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;
}