C++ 网络编程入门:TCP 协议下的简易计算器项目
结合网络套接字、序列化与反序列化以及守护进程等知识点,我们来实现一个小型的 TCP 计算器项目。
项目结构
.vscode/
log.hpp // 日志记录头文件
Makefile // 构建脚本
Protocol.hpp // 通信协议定义(数据格式、序列化规则)
ServerCal.hpp // 服务器计算逻辑声明
Socket.hpp // 套接字操作封装
TcpClient/ // 客户端相关文件夹
TcpClient.cc // 客户端实现
TcpClient.hpp // 客户端声明
TcpServer/ // 服务端相关文件夹
TcpServer.cc // 服务端实现
TcpServer.hpp // 服务端声明
TCP 服务端设计
核心类 TcpServer (TcpServer.hpp)
这个类负责监听端口、接受连接并分发处理。我们使用回调函数来处理具体的业务逻辑,这样主循环可以保持干净。
#include <functional>
#include "Socket.hpp"
#include "ServerCal.hpp"
// 定义回调函数类型:接收数据包字符串,返回响应字符串
using func_t = std::function<std::string(std::string& package)>;
class TcpServer {
public:
// 构造函数:绑定端口和回调函数
TcpServer(uint16_t port, func_t callback) : port_(port), callback_(callback) {}
// 初始化:创建套接字、绑定、监听
void Init() {
listensock_.Socket();
listensock_.Bind(port_);
listensock_.Listen();
lg(INFO, "Server Init");
}
// 启动服务:主循环接受连接
{
() {
std::string ip;
port;
fd = listensock_.(&ip, &port);
(INFO, );
(fork() == ) {
(INFO, );
listensock_.();
std::string inbuffer_stream;
() {
buffer[];
n = (fd, &buffer, (buffer));
(n > ) {
(INFO, );
buffer[n] = ;
inbuffer_stream += buffer;
std::string info = (inbuffer_stream);
(info.()) ;
(fd, info.(), info.());
} (n == ) {
;
} {
;
}
}
();
}
(fd);
}
}
:
port_;
Sock listensock_;
callback_;
};



