boost-asio学习2——同步、异步socket处理

本文介绍了如何使用Boost ASIO库进行TCP通信,重点讲解了socket、acceptor和resolver类的使用。通过示例展示了同步和异步方式下服务器端和客户端的实现,包括连接、读写数据和异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")); // 发送
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值