linux

C++ Linux服务器编程初探

小樊
44
2025-05-02 07:30:06
栏目: 云计算

在Linux环境下进行C++服务器编程是一个非常有趣且实用的主题。以下是一些基本的步骤和概念,帮助你入门:

1. 环境准备

2. 基本概念

3. 创建一个简单的TCP服务器

以下是一个使用标准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;
}

4. 编译和运行

使用以下命令编译和运行服务器:

g++ -o server server.cpp
./server

5. 使用Boost.Asio进行异步编程

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;
}

6. 编译和运行

使用以下命令编译和运行服务器:

g++ -o server server.cpp -lboost_system -pthread
./server

总结

以上是一个简单的C++服务器编程入门指南。你可以根据自己的需求选择合适的库和方法进行更复杂的网络编程。希望这些信息对你有所帮助!

0
看了该问题的人还看了