在 Linux 下用 C++ 做服务器,通常分为 基础网络服务器 和 现代工程化服务器 两大类。下面从入门到进阶,给你一个清晰路线,并附示例代码。
这是 Linux C++ 服务器最核心、最底层的方式。
socket / bind / listen / accept / recv / sendselect / poll / epoll)#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(server_fd, (sockaddr*)&addr, sizeof(addr));
listen(server_fd, 10);
std::cout << "Server listening on port 8080..." << std::endl;
int client_fd = accept(server_fd, nullptr, nullptr);
char buf[1024]{};
read(client_fd, buf, sizeof(buf));
std::cout << "Client: " << buf << std::endl;
send(client_fd, "Hello from server", 18, 0);
close(client_fd);
close(server_fd);
}
✅ 适合学习
❌ 一个客户端、阻塞、不能并发
if (fork() == 0) {
// child process
close(server_fd);
// handle client
exit(0);
}
#include <pthread.h>
void* handle(void* arg) {
int fd = *(int*)arg;
// handle client
close(fd);
return nullptr;
}
✅ 简单
❌ 性能一般
epoll_createepoll_ctlepoll_waitint epfd = epoll_create(1);
epoll_event ev, events[1024];
ev.events = EPOLLIN;
ev.data.fd = server_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, server_fd, &ev);
while (true) {
int n = epoll_wait(epfd, events, 1024, -1);
for (int i = 0; i < n; ++i) {
if (events[i].data.fd == server_fd) {
// accept
} else {
// recv
}
}
}
✅ 高并发(10万+连接)
✅ Linux 服务器主流方案
#include <boost/asio.hpp>
using namespace boost::asio;
io_context io;
ip::tcp::acceptor acc(io, ip::tcp::endpoint(ip::tcp::v4(), 8080));
✅ 异步
✅ 工程化
✅ 企业常用
| 库 | 说明 |
|---|---|
| muduo | 陈硕,Linux 高性能 |
| libevent | C 风格 |
| libuv | Node.js 底层 |
| Poco | 企业级 |
Client
↓
Reactor / Epoll / IO Multiplexing
↓
Worker Thread Pool
↓
Business Logic
↓
Database / Cache
✅ Linux 系统编程
✅ 网络协议(TCP/IP、HTTP)
✅ 多线程 / 线程池
✅ 内存管理
✅ 日志、配置、信号处理
✅ 性能调优(fd、backlog、send buffer)
你可以告诉我:
我可以直接给你 完整项目结构 + Makefile + 实战代码。