07-Daytime.2-A synchronous TCP daytime server

本教程程序展示了如何使用asio实现一个基于TCP的服务器应用程序。

#include <ctime>
#include <string>

#include <asio.hpp>
#include <spdlog/spdlog.h>

using asio::ip::tcp;

// 我们定义了函数 make_daytime_string() 来创建要发送回客户端的字符串。
// 这个函数将在我们所有的daytime服务器应用程序中重复使用。
std::string make_daytime_string()
{
    using namespace std;
    time_t now = time(0);
    return ctime(&now);
}

int main(int argc, char* argv[])
{
    try {
        asio::io_context io;
        // 需要创建一个ip::tcp::acceptor对象来监听新的连接。它被初始化为在TCP端口13上监听,支持IPv4协议。
        tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 13));
        spdlog::info("Server listening on port 13");

        // 这是一个迭代服务器,意味着它一次只能处理一个连接。创建一个套接字来代表与客户端的连接,然后等待连接。
        for (;;) {
            tcp::socket socket(io);
            acceptor.accept(socket);

            // 一个客户正在访问我们的服务。确定当前时间并将此信息传递给客户。
            std::string message = make_daytime_string();
            std::error_code ignored_error;
            asio::write(socket, asio::buffer(message), ignored_error);
        }
        spdlog::info("Server stopped");
    } catch (const std::exception& e) {
        spdlog::error("Exception: {}", e.what());
        return 1;
    }
}

运行结果

提示:由于13号端口是系统保留端口,所以需要管理员权限才能运行。

server:

  build sudo ./07/asio_07
[sudo] wdj 的密码: 
[2026-02-20 11:47:40.621] [info] Server listening on port 13

client:

  asio ./build/06/asio_06 192.168.0.14
[2026-02-20 11:50:51.649] [info] Received: Fri Feb 20 11:50:51 2026