boost asio 简单示例
生活随笔
收集整理的這篇文章主要介紹了
boost asio 简单示例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
客戶端:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using boost::asio::ip::tcp;
using boost::asio::ip::address;
class session: public boost::enable_shared_from_this<session> {
public:
????session(boost::asio::io_service &io_service, tcp::endpoint &endpoint)
????????: io_service_(io_service), socket_(io_service), endpoint_(endpoint)
????{
????}
????void start() {
????????socket_.async_connect(endpoint_,
????????????????boost::bind(&session::handle_connect,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error));
????}
private:
????void handle_connect(const boost::system::error_code &error) {
????????if (error) {
????????????if (error.value() != boost::system::errc::operation_canceled) {
????????????????std::cerr << boost::system::system_error(error).what() << std::endl;
????????????}
????????????socket_.close();
????????????return;
????????}
????????static tcp::no_delay option(true);
????????socket_.set_option(option);
????????strcpy(buf, "Hello World!\n");
????????boost::asio::async_write(socket_,
????????????????boost::asio::buffer(buf, strlen(buf)),
????????????????boost::bind(&session::handle_write,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error,
????????????????????boost::asio::placeholders::bytes_transferred));
????}
????void handle_write(const boost::system::error_code& error, size_t bytes_transferred) {
????????memset(buf, sizeof(buf), 0);
????????boost::asio::async_read_until(socket_,
????????????????sbuf,
????????????????"\n",
????????????????boost::bind(&session::handle_read,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error,
????????????????????boost::asio::placeholders::bytes_transferred));
????}
????void handle_read(const boost::system::error_code& error, size_t bytes_transferred) {
????????std::cout << buf << std::endl;
????}
private:
????boost::asio::io_service &io_service_;
????tcp::socket socket_;
????tcp::endpoint &endpoint_;
????char buf[1024];
????boost::asio::streambuf sbuf;
};
typedef boost::shared_ptr<session> session_ptr;
int main(int argc, char* argv[])
{
????boost::asio::io_service io_service;
????tcp::endpoint endpoint(address::from_string("192.168.1.1"), 10028);
????session_ptr new_session(new session(io_service, endpoint));
????new_session->start();
????io_service.run();
????return 0;
}
服務(wù)器:
#include <string.h>
#include <boost/asio.hpp>
#include <boost/bind.hpp> #include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using boost::asio::ip::tcp;
using boost::asio::ip::address;
class session: public boost::enable_shared_from_this<session> {
public:
????session(boost::asio::io_service &io_service): socket_(io_service)
????{
????}
????void start() {
????????static tcp::no_delay option(true);
????????socket_.set_option(option);
????????boost::asio::async_read_until(socket_,
????????????????sbuf_,
????????????????"\n",
????????????????boost::bind(&session::handle_read,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error,
????????????????????boost::asio::placeholders::bytes_transferred));
????}
????tcp::socket &socket() {
????????return socket_;
????}
private:
????void handle_write(const boost::system::error_code& error, size_t bytes_transferred) {
????????boost::asio::async_read_until(socket_,
????????????????sbuf_,
????????????????"\n",
????????????????boost::bind(&session::handle_read,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error,
????????????????????boost::asio::placeholders::bytes_transferred));
????}
????void handle_read(const boost::system::error_code& error, size_t bytes_transferred) {
????????boost::asio::async_write(socket_,
????????????????sbuf_,
????????????????boost::bind(&session::handle_write,
????????????????????shared_from_this(),
????????????????????boost::asio::placeholders::error,
????????????????????boost::asio::placeholders::bytes_transferred));
????}
private:
????tcp::socket socket_;
????boost::asio::streambuf sbuf_;
};
typedef boost::shared_ptr<session> session_ptr;
class server {
public:
????????server(boost::asio::io_service &io_service, tcp::endpoint &endpoint)
????????????: io_service_(io_service), acceptor_(io_service, endpoint)
????????{
????????????session_ptr new_session(new session(io_service_));
????????????acceptor_.async_accept(new_session->socket(),
????????????????boost::bind(&server::handle_accept,
????????????????????this,
????????????????????new_session,
????????????????????boost::asio::placeholders::error));
????????}
????????void handle_accept(session_ptr new_session, const boost::system::error_code& error) {
????????????if (error) {
????????????????return;
????????????}
????????????new_session->start();
????????????new_session.reset(new session(io_service_));
????????????acceptor_.async_accept(new_session->socket(),
????????????????boost::bind(&server::handle_accept,
????????????????????this,
????????????????????new_session,
????????????????????boost::asio::placeholders::error));
????????}
????????void run() {
??????????? io_service_.run();
????????}
private: ????????boost::asio::io_service &io_service_;
????????tcp::acceptor acceptor_;
};
int main(int argc, char* argv[])
{
????boost::asio::io_service io_service;
????tcp::endpoint endpoint(address::from_string("192.168.1.1"), 10028);
????server s(io_service, endpoint);
????s.run();
????return 0;
}
編譯:
g++ -Wall -o client client.cpp -lboost_system
g++ -Wall -o server server.cpp -lboost_system
這里需要注意的是: async_write, async_read, async_read_until 都是需要達(dá)到特定條件才會調(diào)用回調(diào)函數(shù),
在調(diào)用回調(diào)函數(shù)之前, 不能再次調(diào)用, 否則接收到的數(shù)據(jù)很可能是亂的. 所以, 在實際代碼當(dāng)中, 會有一個寫緩沖隊列, 當(dāng)需要write的時, 先放到隊列中, 如果隊列個數(shù)為1, 則調(diào)用async_write, 否則等待函數(shù)回調(diào), 當(dāng)函數(shù)回調(diào)時將首個元素從隊列中移除, 然后接著發(fā)送下一個, 直到隊列為空.
對于client, 由于is_open在async_connect之后就是true狀態(tài)了, 因此在async_connect回調(diào)返回之前沒有方法知道是否已經(jīng)連接成功, 實際代碼當(dāng)中一般會增加一個變量以表示該套接字是否已經(jīng)允許發(fā)送數(shù)據(jù).
服務(wù)器:
編譯:
g++ -Wall -o client client.cpp -lboost_system
g++ -Wall -o server server.cpp -lboost_system
這里需要注意的是: async_write, async_read, async_read_until 都是需要達(dá)到特定條件才會調(diào)用回調(diào)函數(shù),
在調(diào)用回調(diào)函數(shù)之前, 不能再次調(diào)用, 否則接收到的數(shù)據(jù)很可能是亂的. 所以, 在實際代碼當(dāng)中, 會有一個寫緩沖隊列, 當(dāng)需要write的時, 先放到隊列中, 如果隊列個數(shù)為1, 則調(diào)用async_write, 否則等待函數(shù)回調(diào), 當(dāng)函數(shù)回調(diào)時將首個元素從隊列中移除, 然后接著發(fā)送下一個, 直到隊列為空.
對于client, 由于is_open在async_connect之后就是true狀態(tài)了, 因此在async_connect回調(diào)返回之前沒有方法知道是否已經(jīng)連接成功, 實際代碼當(dāng)中一般會增加一個變量以表示該套接字是否已經(jīng)允許發(fā)送數(shù)據(jù).
總結(jié)
以上是生活随笔為你收集整理的boost asio 简单示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boost asio 异步实现tcp通讯
- 下一篇: 基于SDP的提议/应答(offer/an