下面是一个基础的同步客户端例子:
using boost::asio;
io_service service;
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001);
ip::tcp::socket sock(service);
sock.connect(ep);
首先,你的程序至少需要一个io_service实例。Boost.Asio使用io_service同操作系统的输入/输出服务进行交互。通常一个io_service的实例就足够了。然后,创建你想要连接的地址和端口,并创建socket。把socket连接到你创建的地址和端口。
下面是一个简单的同步服务器端:
using boost::asio;
typedef boost::shared_ptr socket_ptr;
io_service service;
ip::tcp::endpoint ep( ip::tcp::v4(), 2001)); // listen on 2001
ip::tcp::acceptor acc(service, ep);
while ( true) {
socket_ptr sock(new ip::tcp::socket(service));
acc.accept(*sock);
boost::thread( boost::bind(client_session, sock));
}
void client_session(socket_ptr sock) {
while ( true) {
char data[512];
size_t len = sock->read_some(buffer(data));
if ( len > 0)
write(*sock, buffer("ok", 2));
}
}
首先,同样是至少需要一个io_service实例。然后你指定你想要监听的端口,再创建一个接收器——一个用来接收客户端连接的对象。 在接下来的循环中,你创建一个虚拟socket并等待客户端的连接。一旦连接建立,你需要创建一个线程来处理这个连接。
在client_session线程中来读取一个客户端的请求,解析请求,然后进行回复。
而创建一个异步的客户端,你需要做如下的事情:
using boost::asio;
io_service service;
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001);
ip::tcp::socket sock(service);
sock.async_connect(ep, connect_handler);
service.run();
void connect_handler(const boost::system::error_code & ec) {
// 如果ec表示“成功”我们就可以知道连接成功了
}
在程序中你需要创建至少一个io_service实例。你需要指定连接的地址以并创建socket。
每一个异步操作都有一个完成处理程序——一个操作完成之后被调用的函数。
下面是一个简单的异步服务器端:
using boost::asio;
typedef boost::shared_ptr socket_ptr;
io_service service;
ip::tcp::endpoint ep( ip::tcp::v4(), 2001)); // 监听端口2001
ip::tcp::acceptor acc(service, ep);
socket_ptr sock(new ip::tcp::socket(service));
start_accept(sock);
service.run();
void start_accept(socket_ptr sock) {
acc.async_accept(*sock, boost::bind( handle_accept, sock, _1) );
}
void handle_accept(socket_ptr sock, const boost::system::error_code &err) {
if (err) return;
// 从这里开始, 你可以从socket读取或者写入
socket_ptr sock(new ip::tcp::socket(service));
start_accept(sock);
}
在上述代码片段中,首先,你创建一个io_service实例,指定监听的端口。然后,你创建接收器acc——一个用来接受客户端连接的对象,创建虚拟socket,异步等待客户端连接。
在使用这个socket之后,会创建一个新的socket,然后再次调用start_accept(),它会添加另外一个“等待客户端连接”的异步操作,从而使service.run()循环一直保持忙碌状态。
参考链接:http://download.csdn.net/download/caoshangpa/10229882