You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中通过Socket发送带颜色的消息?

嘿,刚好碰到过类似的需求,给你几个便捷的方案,能帮你不用每次手动拼接颜色宏和消息内容,直接给socket发送带颜色的消息~

方案1:封装一个带颜色消息生成函数

这个方法适合需要复用带颜色消息的场景,帮你自动拼接颜色前缀、消息内容和重置代码,还能处理动态消息:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils.h"

// 生成带颜色的完整消息,记得用完后free内存
char* create_colored_msg(const char* color_code, const char* content) {
    if (!color_code || !content) return NULL;

    size_t total_length = strlen(color_code) + strlen(content) + strlen(RESET) + 1;
    char* colored_msg = (char*)malloc(total_length);
    if (!colored_msg) {
        perror("malloc failed");
        return NULL;
    }

    // 按顺序拼接颜色、内容、重置代码
    strcpy(colored_msg, color_code);
    strcat(colored_msg, content);
    strcat(colored_msg, RESET);

    return colored_msg;
}

使用的时候就很简单了:

// 生成红色消息
char* msg_to_send = create_colored_msg(RED, "服务器即将重启,请保存数据!");
if (msg_to_send) {
    send(client_socket[caller], msg_to_send, strlen(msg_to_send), 0);
    free(msg_to_send); // 一定要释放内存,避免泄漏
}

方案2:用宏简化拼接(适合字符串字面量)

如果你的消息大多是固定的字符串字面量,可以直接在utils.h里加个宏,一键生成带颜色的字符串:

// 在utils.h中添加
#define COLORED(color, text) color text RESET

发送的时候直接用:

send(client_socket[caller], COLORED(BLU, "欢迎连接到服务器!"), strlen(COLORED(BLU, "欢迎连接到服务器!")), 0);

如果是动态内容(比如变量),可以用另一个宏结合snprintf:

// 处理动态内容的宏,需要传入缓冲区
#define FORMAT_COLORED(buf, color, fmt, ...) \
    snprintf(buf, sizeof(buf), "%s" fmt "%s", color, __VA_ARGS__, RESET)

使用示例:

char msg_buf[512];
// 格式化带颜色的动态消息,比如显示用户ID
FORMAT_COLORED(msg_buf, GRN, "用户[%d]已上线", user_id);
send(client_socket[caller], msg_buf, strlen(msg_buf), 0);

方案3:直接封装带颜色的发送函数

如果不需要保存生成的消息,只是直接发送,可以封装一个发送函数,分三次发送颜色代码、消息、重置代码(TCP协议下会自动合并数据流,接收端能拿到完整内容):

#include <string.h>
#include <sys/socket.h>
#include "utils.h"

// 直接发送带颜色的消息,无需额外内存分配
ssize_t send_colored(int sock_fd, const char* color_code, const char* content) {
    if (!color_code || !content) return -1;

    ssize_t sent = 0;
    // 发送颜色前缀
    sent += send(sock_fd, color_code, strlen(color_code), 0);
    // 发送消息内容
    sent += send(sock_fd, content, strlen(content), 0);
    // 发送重置代码,避免后续消息带颜色
    sent += send(sock_fd, RESET, strlen(RESET), 0);

    return sent;
}

使用时一步到位:

send_colored(client_socket[caller], YEL, "警告:你的连接即将超时!");

注意事项

  • 接收端必须支持ANSI转义序列:如果接收端是不支持颜色的终端或者其他程序,会直接显示\x1B[31m这类原始字符,所以要确保接收端能解析颜色代码。
  • UDP协议注意:如果用UDP发送,分三次send可能会导致消息被拆分成多个数据包,这时候建议用方案1或2,拼接成一个缓冲区后再一次性发送。

内容的提问来源于stack exchange,提问作者Emily Yeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:38:47