ip::tcp的内部类型socket、acceptor和resolver是asio库TCP通信中最核心的一组类,它们封装了socket的连接、断开和数据收发功能,使用它们可以很容易地编写出socket程序。
socket类是TCP通信的基本类,调用成员函数connect()可以连接到一个指定的通信端点,连接成功后用local_endpoint()和remote_endpoint()获得连接两端的端点信息,用read_some()和write_some()阻塞读写数据,当操作完成后使用close()函数关闭socket。如果不关闭socket,那么在socket对象析构时也会自动调用close()关闭。
acceptor类对应socketAPI的accept()函数功能,它用于服务器端,在指定的端口号接受连接,必须配合socket类才能完成通信。
resolver类对应socketAPI的getaddrinfo()系列函数,用于客户端解析网址获得可用的IP地址,解析得到的IP地址可以使用socket对象连接。
下面是一个使用socket类和acceptor类来实现一对同步通信的服务器和客户端程序:
服务器端(它使用一个acceptor对象在6688端口接受连接,当有连接时使用一个socket对象发送一个字符串):
同步
socket
处理
服务器端:
server.cpp
#include "boost/asio.hpp"
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "iostream"
using namespace std;
int main()
{
try //function-try
块
{
cout << "server start" << endl;
boost::asio::io_service ios; //asio
程序必须的
io_service
对象
boost::asio::ip::tcp::acceptor acceptor(ios, //
创建
acceptor
对象,
iPv4
boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 7001)); //
接受
7001
端口
cout << acceptor.local_endpoint().address() << endl;
while (true) //
执行循环服务
{
boost::asio::ip::tcp::socket sock(ios); //
一个
socket
对象
acceptor.accept(sock); //
阻塞等待
socket
连接
cout << "client : ";
cout << sock.remote_endpoint().address() << endl;
sock.write_some(boost::asio::buffer("hello asio")); //
发送