boost庫之socket 非阻塞/緩衝區大小等屬性設定
阿新 • • 發佈:2019-01-30
asio socket 非阻塞/緩衝區大小等屬性設定ip::tcp::socket m_socket
//設定阻塞與非阻塞
void SetNoBlock(bool bNoBlock)
{
if(bNoBlock)
{
boost::asio::socket_base::bytes_readable command(true);
m_socket.io_control(command);
}
else
{
//阻塞
boost::asio::socket_base::bytes_readable command(false);
m_socket.io_control(command);
}
}//設定傳送緩衝區大小
void SetSendBufferSize(int nSize)
{
boost::asio::socket_base::send_buffer_size size_option(nSize);
m_socket.set_option(size_option);
}//設定接收緩衝區大小
void SetRecvBufferSize(int nSize)
{
boost::asio::socket_base::receive_buffer_size size_option(nSize);
m_socket.set_option(size_option);
}socket 埠複用
1).在boost的acceptor類說明中有這樣的一個例子。用set_option設定埠是否可複用。
boost::asio::ip::tcp::acceptor acceptor(io_service);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();2).還有一種方法 就是在acceptor的建構函式,下面是acceptor的建構函式,我們看到,第三個引數名reuse_addr 。預設是可以埠複用的,要設定是否複用,也可以通過該處傳參。
basic_socket_acceptor(boost::asio::io_service& io_service,const endpoint_type& endpoint, bool reuse_addr = true)//不停留,不管資料多小都發送到對端。停留,只有資料達到一定大小或者超時時,將資料傳送對倒對端。
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
//保持常連線
m_socket.set_option(boost::asio::socket_base::keep_alive(true));同步連線超時設定,沒有對應的set_option引數,asio自帶的例子裡是用deadline_timer的async_wait方法來實現超時。
1).deadline_timer的async_wait方法
參考:http://blog.csdn.net/li_jian_xing/article/details/50394116
2).傳統的Winsock程式設計可以先把socket設為非阻塞,然後connect,通過boost::asio::ip::tcp::socket類的native函式獲取到原始sokcet,再用select來判斷超時,asio也可以這樣做,唯一“非主流”的是asio裡沒有一個類似select的函式,所以得呼叫原始的Winsock API,也就犧牲了跨平臺。
參考:http://blog.csdn.net/lazy_cc/article/details/7941069
//設定阻塞與非阻塞
void SetNoBlock(bool bNoBlock)
{
if(bNoBlock)
{
boost::asio::socket_base::bytes_readable command(true);
m_socket.io_control(command);
}
else
{
//阻塞
boost::asio::socket_base::bytes_readable command(false);
m_socket.io_control(command);
}
}//設定傳送緩衝區大小
void SetSendBufferSize(int nSize)
{
boost::asio::socket_base::send_buffer_size size_option(nSize);
m_socket.set_option(size_option);
}//設定接收緩衝區大小
void SetRecvBufferSize(int nSize)
{
boost::asio::socket_base::receive_buffer_size size_option(nSize);
m_socket.set_option(size_option);
}socket 埠複用
1).在boost的acceptor類說明中有這樣的一個例子。用set_option設定埠是否可複用。
boost::asio::ip::tcp::acceptor acceptor(io_service);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();2).還有一種方法 就是在acceptor的建構函式,下面是acceptor的建構函式,我們看到,第三個引數名reuse_addr 。預設是可以埠複用的,要設定是否複用,也可以通過該處傳參。
basic_socket_acceptor(boost::asio::io_service& io_service,const endpoint_type& endpoint, bool reuse_addr = true)//不停留,不管資料多小都發送到對端。停留,只有資料達到一定大小或者超時時,將資料傳送對倒對端。
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
//保持常連線
m_socket.set_option(boost::asio::socket_base::keep_alive(true));同步連線超時設定,沒有對應的set_option引數,asio自帶的例子裡是用deadline_timer的async_wait方法來實現超時。
1).deadline_timer的async_wait方法
參考:http://blog.csdn.net/li_jian_xing/article/details/50394116
2).傳統的Winsock程式設計可以先把socket設為非阻塞,然後connect,通過boost::asio::ip::tcp::socket類的native函式獲取到原始sokcet,再用select來判斷超時,asio也可以這樣做,唯一“非主流”的是asio裡沒有一個類似select的函式,所以得呼叫原始的Winsock API,也就犧牲了跨平臺。
參考:http://blog.csdn.net/lazy_cc/article/details/7941069