在Linux环境下进行C++服务器编程是一个非常有趣且实用的主题。以下是一些基本的步骤和概念,帮助你入门:
以下是一个使用标准C++库和Socket API创建的简单TCP服务器示例:
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// 绑定socket到指定端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port 8080" << std::endl;
while (true) {
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
continue;
}
// 读取客户端发送的数据
read(new_socket, buffer, 1024);
std::cout << "Message from client: " << buffer << std::endl;
// 发送响应给客户端
send(new_socket, "Hello from server", 18, 0);
std::cout << "Response sent to client" << std::endl;
// 关闭连接
close(new_socket);
}
return 0;
}
使用以下命令编译和运行服务器:
g++ -o server server.cpp
./server
Boost.Asio是一个强大的网络编程库,支持同步和异步操作。以下是一个简单的异步TCP服务器示例:
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class Session : public std::enable_shared_from_this<Session> {
public:
Session(tcp::socket socket) : socket_(std::move(socket)) {}
void start() {
read();
}
private:
void read() {
auto self(shared_from_this());
boost::asio::async_read(socket_, boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
std::cout << "Message from client: " << std::string(data_, length) << std::endl;
write(length);
}
});
}
void write(std::size_t length) {
auto self(shared_from_this());
boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
[this, self](boost::system::error_code ec, std::size_t /*length*/) {
if (!ec) {
read();
}
});
}
tcp::socket socket_;
enum { max_length = 1024 };
char data_[max_length];
};
class Server {
public:
Server(boost::asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
accept();
}
private:
void accept() {
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket) {
if (!ec) {
std::make_shared<Session>(std::move(socket))->start();
}
accept();
});
}
tcp::acceptor acceptor_;
};
int main() {
try {
boost::asio::io_context io_context;
Server server(io_context, 8080);
io_context.run();
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
使用以下命令编译和运行服务器:
g++ -o server server.cpp -lboost_system -pthread
./server
以上是一个简单的C++服务器编程入门指南。你可以根据自己的需求选择合适的库和方法进行更复杂的网络编程。希望这些信息对你有所帮助!