tcp::socket一个TCP连接定位boost::asio::ip::tcp::socket表示一个已建立的 TCP 连接的端点本地 - 对端。服务端acceptor接入后得到一个 socket每个客户端对应一个 socket。客户端自己创建 socket然后connect到服务端。生命周期与所有权socket 里面持有 OS 的文件描述符fd。析构或close()会关闭连接。异步操作async_read/async_write不会“延长 socket 所属对象的生命周期”所以通常把 socket 放在Session里并用shared_from_this()保活 Session。常用信息获取socket.local_endpoint()本地地址端口服务端常用于确认绑定/连接信息socket.remote_endpoint()对端地址端口打印客户端 IP/端口这些调用可能失败比如连接已断要用带error_code的重载避免抛异常boost::system::error_code ec;autoepsocket.remote_endpoint(ec);常用读写API同步socket.read_some(buffer)socket.write_some(buffer)异步socket.async_read_some(buffer, handler)读到“当前可读的一部分”就回调字节流写通常配合asio::async_write(socket, buffer, handler)保证把给定 buffer写完内部可能多次 write读用async_read_some很常见写尽量用async_write省心。连接相关API客户端连接socket.async_connect(endpoint, handler)关闭socket.shutdown(tcp::socket::shutdown_both)半关闭/全关闭socket.close()半关闭shutdown的概念shutdown_send我不再发送向对端发 FIN但仍可接收shutdown_receive我不再接收很少用实战一般做“优雅断开”会shutdown_both然后close或直接 closesocket option用socket.set_option(...)设置tcp::no_delay(true)关闭 Nagle降低小包延迟IM/游戏常开asio::socket_base::keep_alive(true)开启 TCP keepalive但具体探测参数由系统设置决定asio::socket_base::reuse_address(true)通常用于 acceptor但有时也见于 socket一般关注 acceptor 即可多线程并发安全同一个 socket 的多个 handler 可能并发执行多线程 run 时。对 socket 的访问、以及与之相关的状态缓冲、队列、closed_建议统一在strand中执行。同一个 socket 上不要并发启动多个async_write顺序/缓冲很容易乱。正确做法是写队列串行发送。tcp::accepter监听器负责接入管理定位boost::asio::ip::tcp::acceptor表示一个“监听 socket”bind 到某个地址端口listenaccept 新连接产出一个tcp::socket一句话acceptor 管“接入”socket 管“通信”。典型服务端流程Asio 里通常简写成构造 acceptor 时直接绑定 endpointtcp::endpoint ep(tcp::v4(), port);acceptor.open(ep.protocol());acceptor.set_option(reuse_address(true));acceptor.bind(ep);acceptor.listen(backlog);acceptor.async_accept(handler);循环也可以tcp::acceptoracceptor(io,tcp::endpoint(tcp::v4(),port));async_accept常见写法1. 让acceptor创建 socket 并在回调里拿到acceptor.async_accept([](ec,tcp::socket socket){...});2. 自己准备一个 socket 传进去tcp::socketsocket(io);acceptor.async_accept(socket,handler);必须记住的模式accept 循环在 handler 里继续调用 do_accept()否则只能接一次voiddo_accept(){acceptor.async_accept([this](ec,socket){if(!ec)start_session(std::move(socket));do_accept();});}backloglisten(backlog)的 backlog 是“内核为你排队等待 accept 的连接队列长度”。backlog 太小高并发短连接时容易出现连接被拒绝/握手失败。Asio 默认值通常够用但做压测/生产建议显式设置acceptor.listen(asio::socket_base::max_listen_connections);地址复用服务端常见重启服务端立刻 bind 失败Address already in use通常是 TIME_WAIT 相关。常用acceptor.set_option(asio::socket_base::reuse_address(true));注意reuse_address行为在不同系统略有差异但对“快速重启服务”通常有帮助。关闭 acceptoracceptor.close()停止监听取消正在等待的 accepthandler 会收到 operation_aborted优雅退出时你现在用io.stop()会让所有 pending handler 尽快结束更细粒度可以 close acceptor close all sessions。tcp::resolver / endpoint / 连接建立tcp::endpoint本质是(IP地址, 端口)的组合服务端监听用tcp::endpoint(tcp::v4(), port)0.0.0.0:port客户端连接用通常先 resolver 再得到 endpointtcp::resolverDNS解析客户端常用tcp::resolverresolver(io);autoresultsresolver.resolve(host,port);asio::async_connect(socket,results,handler);results可能包含多个地址IPv4/IPv6、多 A 记录async_connect会逐个尝试直到成功常见的坑socket acceptor忘记 accept 循环只能接一个连接。并发写同一 socket 多次 async_write 并发会乱必须写队列。对象生命周期session 没保活导致回调访问悬空 this。remote_endpoint 抛异常连接断了再取 endpoint 会失败用 error_code 版本。多线程数据竞争没用 strand 就在回调里读写共享状态。