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