继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

C++11入门:构建基础服务器的简单教程

蝴蝶不菲
关注TA
已关注
手记 388
粉丝 81
获赞 381

C++11的发布为现代C++编程带来了许多新功能,使其在服务器端开发中显得尤为强大和高效。这些新特性不仅简化了代码编写,还增强了程序的可读性和可维护性。本文将引导你通过使用C++11的各项特性来构建一个简单的TCP服务器,同时介绍服务器端编程的基础概念以及如何优化程序性能。

C++11基础

类型推断与智能指针

自动类型推断

C++11引入了自动类型推断(也被称为“自动类型推断”或“return type deduction”),简化了函数返回值类型的定义。例如:

int getLength(const std::string& str) {
    return str.length();
}

智能指针(std::unique_ptrstd::shared_ptr

智能指针可以避免内存泄漏和双重删除问题。例如,使用std::unique_ptr

std::unique_ptr<MyClass> ptr(new MyClass());

范围基于的for循环

简化了对容器的迭代,例如:

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto& elem : vec) {
    std::cout << elem << std::endl;
}
服务器端编程概念

服务器端编程涉及处理多个客户端连接、数据传输、并发处理等。在现代网络应用中,使用IO多路复用技术(如EPOLL)可以显著提高性能。

使用C++11构建简单服务器

使用C++11标准库构建TCP服务器

首先,我们需要创建一个简单的TCP Server,利用C++11特性简化代码结构。

#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <functional>

void handleConnection(int sockfd, const std::string & ip, int port) {
    std::string message("Hello, client at " + ip + ":" + std::to_string(port) + "!");
    write(sockfd, message.data(), message.size());
    std::cout << "Sent: " << message << std::endl;
}

int main() {
    int sockfd;
    struct sockaddr_in serv_addr;
    int opt = 1;
    std::string ip = "127.0.0.1";
    const int port = 8888;
    const int backlog = 5;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(ip.c_str());
    serv_addr.sin_port = htons(port);

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) {
        perror("Binding error");
        exit(EXIT_FAILURE);
    }

    if (listen(sockfd, backlog) == -1) {
        perror("Listening error");
        exit(EXIT_FAILURE);
    }

    std::vector<std::thread> threads;

    while (true) {
        int cli_sockfd, addr_len = sizeof(serv_addr);
        if ((cli_sockfd = accept(sockfd, (struct sockaddr *) &serv_addr, &addr_len)) == -1) {
            perror("Accept error");
            continue;
        }
        std::cout << "Connected: " << inet_ntoa(serv_addr.sin_addr) << ":" << ntohs(serv_addr.sin_port) << std::endl;
        threads.emplace_back(std::thread(handleConnection, cli_sockfd, std::string(inet_ntoa(serv_addr.sin_addr)), ntohs(serv_addr.sin_port)));
    }

    for (auto &thread : threads) {
        thread.join();
    }

    close(sockfd);
    return 0;
}

实践与优化

在实际应用中,你可以利用C++11的并发特性来优化服务器性能,例如使用std::async或线程池处理并发连接,或者利用异步IO处理高并发场景。此外,错误处理和日志记录也是确保程序健壮性的重要步骤。

总结与资源

C++11为服务器端开发带来了强大的工具和便利性。通过利用其特性,如智能指针、自动类型推断和并发编程,你可以构建高效、易于维护的服务器程序。为了进一步提升你的技能,推荐探索以下资源:

  • 文档与教程C++11官方文档 提供了详细的语法和特性介绍。
  • 在线课程慕课网 提供了丰富的C++课程,包括C++11特性讲解。
  • 实践项目:尝试参与开源项目,如Boost库,以及构建自己实际的Web服务器或RPC服务。

通过实践和持续学习,你将能够更好地利用C++11特性构建高效、稳定的服务器端应用。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP