第一种方式,较全面的方式
1,创建acceptor io
boost::asio::io_service io_serv;
boost::asio::ip::tcp::acceotpr acceotpr(io_serv);
acceotpr.open(io_serv, ip::tcp::v4());
2,设置端口复用
int on = 1;
setsockopt(acceotpr->native_handle(), SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
setsockopt(acceotpr->native_handle(), SOL_SOCKET, SO_REUSEPORT, (void *)&on, sizeof(on));
//或调用acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
3,设置监听端口
{
//如果监听所有网卡端口号
boost::asio::ip::tcp::endpoint endpoint(ipc::tcp::v4(), port)
//如果监听ip+端口号
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string(ip), port)
}
4,绑定端口
acceotpr.bind(endpoint);
5,监听
acceotpr.listen();
6,异步接收数据
start_accept()
{
boost::asio::ip::tcp::socket *psock = new boost::asio::ip::tcp::socket(io_serv)
acceotpr.async_accept(sock, boost::bind(handle_accept, this, (void *)psock, _1)); //绑定接收函数
}
7,数据处理
handle_accept(void *psock, const boost::system::error_code &error)
{
if(error)
return ;
std::ostringstream local = psock->local_endpoint().address();
std::string local_str = local.str();
std::ostringstream remote = psock->remote_endpoint().address();
std::string remote_str = remote.str();
start_accept();
}
8,执行回调使用
io_serv.run();
第二种方式,简单方式
boost::asio::io_service io_serv;
boost::asio::ip::tcp::acceotpr acceotpr(io_serv, tcp::endpoint(tcp::v4(), port))