C++中的并发多线程网络通讯

C++中的并发多线程网络通讯

一、引言

C++作为一种高效且功能强大的编程语言,为开发者提供了多种工具来处理多线程和网络通信。多线程编程允许多个任务同时执行,而网络通信则是现代应用程序的基石。本文将深入探讨如何使用C++实现并发多线程网络通信,并通过一个实际案例进行说明。

在这里插入图片描述

二、C++多线程基础

  1. 线程创建与管理:C++11引入了<thread>库,使线程操作更加简单。创建线程的基本方法是使用std::thread对象,并传递一个函数(或可调用对象)给它的构造函数。
  2. 线程同步:当多个线程需要访问共享资源时,同步机制就变得尤为重要。互斥量(std::mutex)和条件变量(std::condition_variable)是实现同步的常见手段。
  3. 线程安全与数据竞争:了解线程安全概念以及如何避免数据竞争对于编写健壮的多线程程序至关重要。

三、网络通讯基础

  1. 套接字编程:基于TCP/IP协议的网络通讯常使用套接字(socket)。在C++中,可以使用标准库<sys/socket.h>进行套接字编程,包括创建套接字、绑定地址和端口、监听连接、发送和接收数据等。
  2. 异步I/O与事件驱动编程:对于高性能需求,异步I/O和事件驱动模型能显著提高网络通信的效率。

四、实现并发多线程网络通讯的步骤

  1. 设计线程模型:根据应用程序的需求,设计合适的线程模型。常见的模型有单线程异步I/O、多线程每连接一个线程、线程池等。
  2. 创建套接字并监听连接:使用socket()函数创建套接字,bind()函数绑定地址和端口,listen()函数开始监听连接请求。
  3. 接受连接并处理请求:在循环中使用accept()函数接受客户端连接,为每个连接创建新线程或使用线程池进行处理。
  4. 读写数据与同步:使用send()recv()函数进行数据传输,确保对共享资源的访问是线程安全的。
  5. 关闭连接与资源清理:适当地关闭套接字并释放资源。

五、实际案例

  1. 简单的多线程TCP服务器:创建一个TCP服务器,为每个接入的连接创建一个新的线程来处理请求。

  2. 代码实现

#include <iostream>
#include <thread>
#include <vector>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

void handle_client(int sockfd) {
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    int bytesReceived = read(sockfd, buffer, sizeof(buffer) - 1);
    if (bytesReceived > 0) {
        std::cout << "Received: " << buffer << std::endl;
        std::string response = "Message received";
        write(sockfd, response.c_str(), response.size());
    }
    close(sockfd);
}

int main() {
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    socklen_t addr_size;

    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == -1) {
        std::cerr << "Could not create socket" << std::endl;
        return 1;
    }

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8080);
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

    if (bind(serverSocket, (struct sockaddr*) &serverAddr, sizeof(serverAddr)) < 0) {
        std::cerr << "Bind failed" << std::endl;
        return 1;
    }

    listen(serverSocket, 3);
    std::cout << "Server listening on port 8080" << std::endl;

    std::vector<std::thread> threads;
    while (true) {
        addr_size = sizeof(clientAddr);
        clientSocket = accept(serverSocket, (struct sockaddr*) &clientAddr, &addr_size);
        if (clientSocket < 0) {
            std::cerr << "Accept failed" << std::endl;
            continue;
        }
        std::cout << "New client connected" << std::endl;
        threads.push_back(std::thread(handle_client, clientSocket));
    }

    for (auto& th : threads) {
        th.join();
    }
    return 0;
}
  1. 说明
  • handle_client 函数是为每个客户端连接创建的线程要执行的函数。它读取客户端发送的消息,并发送一个确认消息回去。
  • main 函数中,我们首先创建一个TCP套接字,然后绑定到8080端口,并开始监听连接。当一个新的客户端连接时,我们接受这个连接,并创建一个新的线程来处理它。所有创建的线程都存储在threads向量中。最后,我们等待所有线程完成其任务。
  • 注意:这个示例没有处理可能的错误和异常,也没有实现优雅地关闭服务器。在实际应用中,你需要增加这些功能。

六、结论

C++提供了强大的工具集来实现并发多线程网络通信。通过合理地设计线程模型和网络通信机制,可以构建高效且可靠的应用程序。然而,多线程编程和网络通信也是复杂的领域,需要深入理解底层原理并仔细处理同步和错误情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/254518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Netty】Netty核心概念

目录 NIO编程NIO介绍NIO和BIO的比较缓冲区(Buffer)基本介绍常用API缓冲区对象创建添加数据读取数据 通道(Channel)基本介绍Channel常用类ServerSocketChannelSocketChannel Selector (选择器)基本介绍常用API介绍示例代码 NIO 三大核心原理 Netty核心概念Netty 介绍原生 NIO 存…

verilog基础语法-计数器

概述&#xff1a; 计数器是FPGA开发中最常用的电路&#xff0c;列如通讯中记录时钟个数&#xff0c;跑马灯中时间记录&#xff0c;存储器中地址的控制等等。本节给出向上计数器&#xff0c;上下计数器以及双向计数器案例。 内容 1. 向上计数器 2.向下计数器 3.向上向下计数…

Minio文件服务器(上传文件)

官网&#xff1a;https://www.minio.org.cn/ 开源的分布式对象存储服务器 Window安装 用户名和密码相同 创建bucket&#xff0c;并且将策略改成public 一、添加依赖 二、代码 public class FileUploadTest{public static void main(String[] args) throws Exception{//…

RHEL8_Linux_Ansible常用模块的使用

本章主要介绍Ansible中最常见模块的使用 shell模块文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下。 ansible 机器名 -m 模块x -a "模块的参数" 对被管理机器执行不同的操作&#xff0c;只需要调用不同的模块…

做计算,找天玑算!

天玑算科研服务_DFT计算_MD模拟_FEA_ML_相图计算200余位计算工程师均来自己TOP高校及科研院所&#xff0c;涉及第一性原理&#xff0c;分子动力学&#xff0c;有限元&#xff0c;机器学习&#xff0c;可为催化、电池、能源、化工、生物等重多领域提供技术支持&#xff0c;计算软…

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

虚幻学习笔记18—C++委托(多播)和事件

一、前言 委托分单播和多播&#xff0c;多播就是可以绑定多个回调函数&#xff0c;然后一次性执行。这样也可以理解为啥多播没有返回值&#xff0c;多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言&#xff0c;只有定义事件的类才能调用 Br…

专属配方重磅发布,蒙牛悠瑞开创中老年奶粉新征程

随着中国老龄化现象日益加剧&#xff0c;中老年人群营养需求市场不断扩容&#xff0c;蒙牛集团2024全球合作伙伴大会奶粉事业部分会成为了备受行业关注的一个焦点&#xff0c;会上蒙牛旗下高端中老年奶粉品牌悠瑞联合中山大学发布了《中国中老年人健康状况及专属营养解决方案》…

SpringCloud微服务之间如何进行调用通信的?

1.同步通信 RESTful API&#xff1a;RESTful 通信使用 HTTP 协议&#xff0c;以 JSON格式来传输数据&#xff0c;具有轻量级、高效、可扩展性等优势&#xff0c;是许多系统之间接口通信的首选方式。&#xff08;springcloud使用&#xff09; RPC&#xff1a;RPC&#xff08;远…

羊大师之冷天喝羊的好处大揭秘!

最近&#xff0c;冷天喝羊已经成为了一种趋势&#xff0c;受到了越来越多人的关注与喜爱。你可能会好奇&#xff0c;为什么冷天喝羊有那么多的好处呢&#xff1f;今天小编羊大师将带大家一起探索这个问题&#xff0c;揭秘冷天喝羊带来的种种益处。 冷天喝羊对于保持身体温暖是…

HarmonyOS--基础组件Button

Button组件 可以包含单个子组件。 Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean }) 1&#xff1a;文字按钮 Button(‘点击’) 2&#xff1a;自定义按钮,嵌套其它组件 Button() {Image(https://) }.type(ButtonType.Circle)

LeetCode-数组-矩阵问题-中等难度

[toc]矩阵 矩阵是二维数组相关的应用题型&#xff0c;常见的有矩阵水平翻转、矩阵对角线翻转、矩阵遍历等。 1. 重塑矩阵 1.1 题目描述 leetcode跳转&#xff1a;566. 重塑矩阵 1.2 方法一&#xff1a;简单模拟 借助一个一维数组用来保持按行列遍历的结果&#xff0c;然后…

欧盟健身单车出口BS EN ISO 20957安全报告测试

固定的训练器材.第10部分:带固定轮或无自由飞轮的训练自行车.附加特定安全要求和试验方法 作为欧洲固定式健身器材&#xff08;儿童用固定式健身器材不在此范围&#xff09;通用安全要求和测试方法的标准&#xff0c;涉及固定式健身器材精度、使用场所分类定义、稳定性、安全间…

Redis设计与实现之订阅与发布

目录 一、 订阅与发布 1、 频道的订阅与信息发送 2、订阅频道 3、发送信息到频道 4、 退订频道 5、模式的订阅与信息发送 ​编辑 6、 订阅模式 7、 发送信息到模式 8、 退订模式 三、订阅消息断连 1、如果订阅者断开连接了&#xff0c;再次连接会不会丢失之前发布的消…

儿童玩具行业分析:发展态势良好,市场空间不断拓展

玩具是有利于促进幼儿体、德、智、美的全面发展;符合儿童年龄特征&#xff0c;能满足其好奇心、好动和探索活动的愿望;造型优美&#xff0c;反映事物的典型特征;活动多变&#xff0c;有助于鼓励学习。中国玩具产品包括毛绒玩具、塑胶玩具、纸质玩具、电子玩具、木制玩具、金属玩…

抖音网红的各种变现办法

抖音作为一款风靡全球的短视频平台&#xff0c;不仅为用户带来了娱乐和社交的乐趣&#xff0c;也为一些优秀的内容创作者提供了机会&#xff0c;成为了网红。而成为抖音网红不仅仅是一种荣誉&#xff0c;更是一种潜在的经济收入来源。在这篇文章中&#xff0c;我将介绍一些抖音…

气泡水机市场调研: 2023年行业消费需求及发展前景分析

气泡水机用于制作气泡水的机器&#xff0c;隶属于家电产业。在欧美等发达国家早已普遍使用&#xff0c;中国仅台湾等开放发达地方盛行。在中国大陆较为少见&#xff0c;近两年以健康环保产品形象兴起&#xff0c;市场饱和度不高。 中国气泡水机首次出现在中国市场是2012年&a…

小红书kop营销策略有哪些,达人投放总结!

从kol到koc&#xff0c;当今时代产品种草模式&#xff0c;层出不穷。品牌想要跟上市场更新迭代的洪流&#xff0c;就需要时刻了解新型的营销方式。那么对于新型的kop模式你了解多少呢?我们今天就将详细分享小红书kop营销策略有哪些&#xff0c;达人投放总结&#xff01; 一、什…

[Ray Tracing in One Weekend] 笔记

前言 本文参照自raytracing in one weekend教程&#xff0c;地址为&#xff1a;https://raytracing.github.io/books/RayTracingInOneWeekend.html 什么是光线追踪&#xff1f; 光线追踪模拟现实中的成像原理&#xff0c;通过模拟一条条直线在场景内反射折射&#xff0c;最终…

Tinymce 5 插入代码集成highlight.js(踩坑记录)

目录 官方教程 坑点一 坑点二 坑点三 坑点四 TinyMCE HighLight.js Plugin 官方教程 1. 引入 tinymce 库文件 <script src"tinymce.min.js"></script> 2. 引入 highlight js 库文件 <script src"plugins/becodesample/highlight.js-11.…