测试简单的asio异步服务过程
来源:互联网 发布:五子棋c语言代码 编辑:程序博客网 时间:2024/05/16 01:10
#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <stdexcept>
#include <boost/asio.hpp>
#include <vector>
#include <thread>
#include <chrono>
using namespace std;
using namespace boost;
using boost::asio::ip::tcp;
string make_time()
{
time_t tm = time(0);
return ctime(&tm);
}
class tcp_connection
{
public:
typedef std::shared_ptr<tcp_connection> pointer;
static pointer create(asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
}
tcp::socket& socket()
{
return socket_;
}
/*
void ReadThread()
{
while( socket_.is_open())
{
socket_.async_read_some(boost::asio::buffer(readMsg, 5),
[=](boost::system::error_code err, size_t byte_trans)
{
handle_read(err, byte_trans);
}
);
this_thread::sleep_for(std::chrono::milliseconds(5));
}
}
*/
void start()
{
message_ = make_time();
asio::async_write(socket_, asio::buffer(message_),
[=](boost::system::error_code err, size_t byte_trans)
{
handle_write(err, byte_trans);
}
);
//thread th([=]() {ReadThread(); });
//thread th(&tcp_connection::ReadThread,this);
//th.join();
}
private:
tcp_connection(asio::io_service& io_service)
:socket_(io_service)
{
}
void handle_write(boost::system::error_code err,size_t byte_trans)
{
cout <<"remote ip="<<socket_.remote_endpoint().address()
<<" remote port="<<socket_.remote_endpoint().port()
<< " write len=" << byte_trans << endl;
}
void handle_read(const boost::system::error_code& error, std::size_t bytes_transferred)
{
cout << "read byte=" << bytes_transferred << endl;
}
private:
tcp::socket socket_;
std::string message_;
char readMsg[100]{ 0 };
};
class tcp_server
{
public:
tcp_server(asio::io_service& io_service)
:acceptor_(io_service,tcp::endpoint(tcp::v4(),13))
{
start_accept();
}
private:
void start_accept()
{
tcp_connection::pointer new_connect = tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connect->socket(),
[=](const boost::system::error_code& error)
{
handle_accept(new_connect, error);
}
);
}
void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error)
{
if(!error)
{
vecConnected.push_back(new_connection);
new_connection->start();
}
start_accept();
}
private:
asio::ip::tcp::acceptor acceptor_;
std::vector<tcp_connection::pointer> vecConnected;
};
int main()
{
try
{
asio::io_service ioSer;
tcp_server tcpServer(ioSer);
ioSer.run();
}
catch(std::exception& exc)
{
cout << exc.what() << endl;
}
getchar();
return 0;
}
#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <stdexcept>
#include <boost/asio.hpp>
#include <vector>
#include <thread>
#include <chrono>
using namespace std;
using namespace boost;
using boost::asio::ip::tcp;
string make_time()
{
time_t tm = time(0);
return ctime(&tm);
}
class tcp_connection
{
public:
typedef std::shared_ptr<tcp_connection> pointer;
static pointer create(asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
}
tcp::socket& socket()
{
return socket_;
}
/*
void ReadThread()
{
while( socket_.is_open())
{
socket_.async_read_some(boost::asio::buffer(readMsg, 5),
[=](boost::system::error_code err, size_t byte_trans)
{
handle_read(err, byte_trans);
}
);
this_thread::sleep_for(std::chrono::milliseconds(5));
}
}
*/
void start()
{
message_ = make_time();
asio::async_write(socket_, asio::buffer(message_),
[=](boost::system::error_code err, size_t byte_trans)
{
handle_write(err, byte_trans);
}
);
//thread th([=]() {ReadThread(); });
//thread th(&tcp_connection::ReadThread,this);
//th.join();
}
private:
tcp_connection(asio::io_service& io_service)
:socket_(io_service)
{
}
void handle_write(boost::system::error_code err,size_t byte_trans)
{
cout <<"remote ip="<<socket_.remote_endpoint().address()
<<" remote port="<<socket_.remote_endpoint().port()
<< " write len=" << byte_trans << endl;
}
void handle_read(const boost::system::error_code& error, std::size_t bytes_transferred)
{
cout << "read byte=" << bytes_transferred << endl;
}
private:
tcp::socket socket_;
std::string message_;
char readMsg[100]{ 0 };
};
class tcp_server
{
public:
tcp_server(asio::io_service& io_service)
:acceptor_(io_service,tcp::endpoint(tcp::v4(),13))
{
start_accept();
}
private:
void start_accept()
{
tcp_connection::pointer new_connect = tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connect->socket(),
[=](const boost::system::error_code& error)
{
handle_accept(new_connect, error);
}
);
}
void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error)
{
if(!error)
{
vecConnected.push_back(new_connection);
new_connection->start();
}
start_accept();
}
private:
asio::ip::tcp::acceptor acceptor_;
std::vector<tcp_connection::pointer> vecConnected;
};
int main()
{
try
{
asio::io_service ioSer;
tcp_server tcpServer(ioSer);
ioSer.run();
}
catch(std::exception& exc)
{
cout << exc.what() << endl;
}
getchar();
return 0;
}
0 0
- 测试简单的asio异步服务过程
- boost asio异步简单测试
- ASIO的异步方式
- boost::ASIO的异步方式
- boost::ASIO的异步方式
- boost::ASIO的异步方式
- boost::asio的异步方式
- boost::ASIO的异步方式
- asio的异步多线程实现
- boost asio的异步服务器
- Boost.asio实现的同步、异步TCP通信的简单例子
- C#:简单的Socket异步通信服务
- asio中异步IO的体会
- boost::asio 的同、异步方式
- boost asio的一个异步调用小测例
- 谈谈boost.asio的异步发送
- boost asio 单线程的异步
- boost::asio 的同、异步方式
- gcc/g++编译优化选项(一)
- Redis Java客户端Jedis
- c语言中几个读取键盘输入带空格字符串的方法
- linux终端出现bash: setup.bash: No such file or directory,和.bashrc文件的问题
- 分享个摄像头视频监控的
- 测试简单的asio异步服务过程
- Two Sum
- parameters
- 我的大学(二)
- dfdsfdsf
- Preference的 相关类 及 常用方法
- 网络层学习笔记
- 安装Ubuntu 14.04后要做的5件事情
- [LeetCode]Sort Colors