MST

星途 面试题库

面试题:C语言函数指针在复杂回调机制中的应用

在一个网络通信库的设计中,需要实现一种复杂的回调机制。当接收到不同类型的网络消息(如连接请求、数据传输、断开连接等)时,调用不同的回调函数进行处理。要求使用C语言函数指针设计一个通用的消息处理框架,该框架能够动态注册和注销回调函数,并且在接收到消息时能够高效地调用相应的回调函数。请详细阐述设计思路并给出核心代码实现。
25.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义消息类型:使用枚举类型来定义不同的网络消息类型,如连接请求、数据传输、断开连接等。
  2. 定义回调函数指针类型:为每种消息类型定义对应的回调函数指针类型,这些回调函数可以接受不同的参数,具体取决于消息处理的需求。
  3. 设计注册和注销函数:设计用于注册和注销回调函数的函数,注册函数将回调函数指针与对应的消息类型关联起来,注销函数则解除这种关联。
  4. 消息处理函数:设计一个消息处理函数,当接收到网络消息时,根据消息类型查找并调用相应的回调函数。

核心代码实现

#include <stdio.h>
#include <stdlib.h>

// 定义消息类型
typedef enum {
    CONNECT_REQUEST,
    DATA_TRANSMISSION,
    DISCONNECT,
    // 可以添加更多消息类型
} MessageType;

// 定义回调函数指针类型
typedef void (*ConnectRequestCallback)();
typedef void (*DataTransmissionCallback)(const char* data, size_t length);
typedef void (*DisconnectCallback)();

// 定义一个结构体来存储回调函数指针
typedef struct {
    ConnectRequestCallback connectRequestCallback;
    DataTransmissionCallback dataTransmissionCallback;
    DisconnectCallback disconnectCallback;
} CallbackRegistry;

// 全局的回调函数注册表
CallbackRegistry callbackRegistry;

// 注册连接请求回调函数
void registerConnectRequestCallback(ConnectRequestCallback callback) {
    callbackRegistry.connectRequestCallback = callback;
}

// 注册数据传输回调函数
void registerDataTransmissionCallback(DataTransmissionCallback callback) {
    callbackRegistry.dataTransmissionCallback = callback;
}

// 注册断开连接回调函数
void registerDisconnectCallback(DisconnectCallback callback) {
    callbackRegistry.disconnectCallback = callback;
}

// 注销连接请求回调函数
void unregisterConnectRequestCallback() {
    callbackRegistry.connectRequestCallback = NULL;
}

// 注销数据传输回调函数
void unregisterDataTransmissionCallback() {
    callbackRegistry.dataTransmissionCallback = NULL;
}

// 注销断开连接回调函数
void unregisterDisconnectCallback() {
    callbackRegistry.disconnectCallback = NULL;
}

// 处理接收到的消息
void handleMessage(MessageType type, const char* data, size_t length) {
    switch (type) {
        case CONNECT_REQUEST:
            if (callbackRegistry.connectRequestCallback) {
                callbackRegistry.connectRequestCallback();
            }
            break;
        case DATA_TRANSMISSION:
            if (callbackRegistry.dataTransmissionCallback) {
                callbackRegistry.dataTransmissionCallback(data, length);
            }
            break;
        case DISCONNECT:
            if (callbackRegistry.disconnectCallback) {
                callbackRegistry.disconnectCallback();
            }
            break;
        default:
            break;
    }
}

// 示例回调函数
void connectRequestHandler() {
    printf("Handling connect request\n");
}

void dataTransmissionHandler(const char* data, size_t length) {
    printf("Handling data transmission: %.*s\n", (int)length, data);
}

void disconnectHandler() {
    printf("Handling disconnect\n");
}

int main() {
    // 注册回调函数
    registerConnectRequestCallback(connectRequestHandler);
    registerDataTransmissionCallback(dataTransmissionHandler);
    registerDisconnectCallback(disconnectHandler);

    // 模拟接收到消息
    handleMessage(CONNECT_REQUEST, NULL, 0);
    handleMessage(DATA_TRANSMISSION, "Hello, World!", 13);
    handleMessage(DISCONNECT, NULL, 0);

    // 注销回调函数
    unregisterConnectRequestCallback();
    unregisterDataTransmissionCallback();
    unregisterDisconnectCallback();

    return 0;
}