C++高频知识点(二十)

文章目录

  • [96. 在C++代码中嵌入C代码,需要怎么做?](#96. 在C++代码中嵌入C代码,需要怎么做?)
  • [97. 进程与线程,分配资源的最小单位是什么?](#97. 进程与线程,分配资源的最小单位是什么?)
  • [98. 讲讲 TCP封包和拆包 。](#98. 讲讲 TCP封包和拆包 。)
  • [99. 谈谈你对网络编程中 epoll的理解](#99. 谈谈你对网络编程中 epoll的理解)
  • [100. C++中智能指针的种类有哪些?](#100. C++中智能指针的种类有哪些?)

96. 在C++代码中嵌入C代码,需要怎么做?

虽然说 C++是C语言的超集,但是他们之间还是有很多差别的, 最主要的是C语言是不支持重载的,还有不是面向对象而是面向过程并且没有虚函数表机制,在编译过程中它对函数名称的组织与C++是不一样的, 因此在C++中引入C语言的函数,需要特别处理。

C 基本不做名称修饰(几乎就是"原名");C++ 一定做名称修饰,把函数签名里的各种信息编码进符号名。因此 C 不能重载,C++ 可以;跨语言调用时,C++ 需要用 extern "C" 关掉修饰。

97. 进程与线程,分配资源的最小单位是什么?

当然是进程

98. 讲讲 TCP封包和拆包 。


封包和拆包的应用场景

代码示例

下面是一个简单的示例,展示了如何通过固定包头实现封包和拆包:

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdint>

class TCPProtocol {
public:
    // 封包,简单例子: 包头包含数据长度
    // 封包:把字符串变成「4字节长度 + 原始字节」
    std::vector<char> packetize(const std::string& data) {
        // 数据长度(32 位)
        uint32_t len = data.size();

        // 申请完整包空间:4 + len
        /*
        packet: [ 00 00 00 0B ] [ 48 65 6C 6C 6F 2C 20 54 43 50 21 ]
                └─4B长度=11──┘  └──────────11 字节原始数据──────────┘
                ^ packet.data()
                            ^ packet.data() + sizeof(len)
        src:   data.data() ->  H  e  l  l  o  ,     T  C  P  !

        */
        std::vector<char> packet(sizeof(uint32_t) + len);
        
        // 包头: 数据长度
        // 写包头:把长度的 4 字节拷到包起始
        // .data() 是 std::vector 的成员函数(std::string 也有)。作用是返回指向底层连续存储的原始指针,方便跟 C 接口(如 memcpy/recv/send)交互。
        std::memcpy(packet.data(), &len, sizeof(len)); //这一步将数据长度作为包头写入数据包的起始位置
        
        // 数据
        //这一步将实际的数据内容写入到数据包中
        // 返回 std::string data 的起始地址(const char*),也就是要拷贝的源数据。
        std::memcpy(packet.data() + sizeof(len), data.data(), len);
        
        return packet;
    }

    // 拆包
    std::string depacketize(const std::vector<char>& packet) {
        uint32_t len = 0;
        
        // 读取包头
        // 把数据包开头的 4 个字节拷进本地变量 len
        std::memcpy(&len, packet.data(), sizeof(len));
        
        // 读取数据
        //这个操作会将数据部分从字节数组 packet 中提取出来,并存储在字符串 data 中。
        // 构造:从 s 开始拷 count 个字节(不需要 '\0' 结尾)
        // std::string::string(const char* s, size_t count);
        std::string data(packet.data() + sizeof(len), len);
        
        return data;
    }
};

int main() {
    TCPProtocol protocol;

    // 原始数据
    std::string data = "Hello, TCP!";

    // 封包
    std::vector<char> packet = protocol.packetize(data);
    
    // 模拟接收后拆包
    std::string receivedData = protocol.depacketize(packet);

    std::cout << "Received Data: " << receivedData << std::endl;

    return 0;
}

99. 谈谈你对网络编程中 epoll的理解


代码示例

cpp 复制代码
#include <sys/epoll.h>
#include <unistd.h>
#include <stdio.h>

#define MAX_EVENTS 10

int main() {
    int epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        perror("epoll_create1");
        return -1;
    }

    // 假设 sock_fd 是已建立的 socket 连接
    int sock_fd; // 此处应有 socket 初始化和连接代码
    struct epoll_event ev;
    ev.events = EPOLLIN; // 监听读事件
    ev.data.fd = sock_fd;
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock_fd, &ev) == -1) {
        perror("epoll_ctl: sock_fd");
        return -1;
    }

    struct epoll_event events[MAX_EVENTS];
    while (true) {
        int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // 无限等待事件发生
        if (nfds == -1) {
            perror("epoll_wait");
            return -1;
        }

        for (int i = 0; i < nfds; ++i) {
            if (events[i].events & EPOLLIN) {
                char buf[512];
                ssize_t count = read(events[i].data.fd, buf, sizeof(buf));
                if (count == -1) {
                    perror("read");
                    return -1;
                } else if (count == 0) {
                    // 对端关闭连接
                    close(events[i].data.fd);
                } else {
                    // 处理读取的数据
                    printf("Received: %s\n", buf);
                }
            }
        }
    }

    close(epoll_fd);
    return 0;
}

100. C++中智能指针的种类有哪些?


之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
R-G-B7 分钟前
【04】OpenCV C++实战篇——实战:发票精准定位,提取指定单元格数据。(倾角计算、旋转矫正、产品定位、目标定位、OCR文字提取)
c++·opencv·ocr·发票精准定位·提取指定单元格数据·倾角计算·旋转矫正
huluang7 分钟前
Word XML 批注范围克隆处理器
开发语言·c#
C4程序员16 分钟前
北京JAVA基础面试30天打卡06
java·开发语言·面试
teeeeeeemo22 分钟前
一些js数组去重的实现算法
开发语言·前端·javascript·笔记·算法
稚肩1 小时前
如何在linux中使用Makefile构建一个C++工程?
linux·运维·c++
啊森要自信1 小时前
【QT】常⽤控件详解(七)容器类控件 GroupBox && TabWidget && 布局管理器 && Spacer
linux·开发语言·c++·qt·adb
SEO-狼术2 小时前
SmartClient 14.1 improves Crack
开发语言
智者知已应修善业2 小时前
【51单片机2个按键控制流水灯转向】2022-10-25
c语言·经验分享·笔记·嵌入式硬件·51单片机
码界筑梦坊2 小时前
97-基于Python的大众点评数据分析预测系统
开发语言·python·数据分析
teeeeeeemo2 小时前
JS实现数组扁平化
开发语言·前端·javascript·笔记·算法