boost庫在工作(36)網路服務端之六

2021-06-17 18:40:04 字數 2755 閱讀 6712

在上面介紹了管理所有連線的類,這個類主要就是新增新的連線,或者刪除不需要的連線。但是管理的類callconnect是沒有辦法知道什麼時候新增,什麼時候刪除的,它需要從接收到連線類裡獲取得到新的連線,從連線類裡獲得刪除的事件。如下面的**:

//封裝乙個服務端類來處理網路。

//軟體開發人員: 蔡軍生 2013-07-28

//class cconnect :

public boost::enable_shared_from_this< cconnect >

boost::asio::ip::tcp::socket& getsocket(void)

//傳送的訊息。

void pushmsg(const std::string& strmsg)

boost::asio::async_write(m_socket,

vsendbuf,

boost::bind(&cconnect::handlewrite, shared_from_this(),

boost::asio::placeholders::error));

} void start(void)

void handleread(const boost::system::error_code& error,

size_t bytes_transferred)

vsendbuf.push_back(boost::asio::buffer(m_chbuffer, bytes_transferred));

boost::asio::async_write(m_socket,

vsendbuf,

boost::bind(&cconnect::handlewrite, shared_from_this(),

boost::asio::placeholders::error));

} else

}void handlewrite(const boost::system::error_code& error)

m_socket.async_read_some(boost::asio::buffer(m_chbuffer, max_bufsize),

boost::bind(&cconnect::handleread, shared_from_this(),

boost::asio::placeholders::error,

boost::asio::placeholders::bytes_transferred));

} else

}private:

// boost::asio::ip::tcp::socket m_socket;

// boost::arraym_chbuffer;

std::string m_strhit;

std::deque< std::string > m_queuemsg;

//儲存所有連線集合。

callconnect& m_rallconnect;

};//伺服器,主要接收新連線,並啟動新連線接收資料。

//軟體開發人員: 蔡軍生 2013-07-28

class cserver

//收到客戶端連線進來事件響應。

void handleaccept(boost::shared_ptr< cconnect > pnewconnect,

const boost::system::error_code& error)

); //如果沒有錯誤,對連線進來的連線收發資料。

pnewconnect->start();

//建立新的連線,以備下乙個客戶端連線進來。

pnewconnect.reset(new cconnect(m_ioservice, m_allconnect));

//做連線準備。

m_acceptor.async_accept(pnewconnect->getsocket(),

boost::bind(&cserver::handleaccept, this, pnewconnect,

boost::asio::placeholders::error));

} }private:

//io服務

boost::asio::io_service& m_ioservice;

//接收器,用來接收新連線進來。

boost::asio::ip::tcp::acceptor m_acceptor;

//管理所有連線。

callconnect m_allconnect;

};//

int _tmain(int argc, _tchar* argv)

在類cserver裡的函式handleaccept通知所有其它連線乙個訊息,如下**:

std::set< boost::shared_ptr< cconnect > >& rall =m_allconnect.getallconnect();

std::for_each(rall.begin(),rall.end(),

[&](boost::shared_ptrpother)

pother->pushmsg("hello!");

這裡使用了乙個c11的特性lambda表示式,達到最清楚化的表示。

然後在類cconnect裡函式start裡呼叫管理類新增的函式,在函式handleread和handlewrite呼叫刪除的函式,這樣就達到連線在管理類裡新增和刪除的響應。通過這樣乙個集合,就可以管理所有連線,跟所有連線進行通訊,或者刪除某乙個連線。

boost庫在工作(31)網路服務端之一

先來看看例子的第一部份,接收連線伺服器部份,如下 伺服器,主要接收新連線,並啟動新連線接收資料。class cserver 收到客戶端連線進來事件響應。void handleaccept boost shared ptr cconnect pnewconnect,const boost system...

boost庫在工作(32)網路服務端之二

下面來仔細地看連線處理的 如下 封裝乙個服務端類來處理網路。class cconnect public boost enable shared from this cconnect boost asio ip tcp socket getsocket void void start void voi...

boost庫在工作(32)網路服務端之二

在這個例子裡,伺服器物件主要使用boost asio io service物件,這個物件主要用來構造非同步接收資料使用,接著定義boost asio ip tcp acceptor物件,這個物件主要用來接收所有連線進來到伺服器的連線,也就是起到監聽的作用。在伺服器類的建構函式裡主要呼叫接受物件的as...