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

C语言多客户端聊天服务器Telnet连接消息格式异常问题

解决Telnet客户端名称导致的消息格式错乱问题

你遇到的核心问题是Telnet传递的输入里不仅有换行符\n,还包含回车符\r。当用户在Telnet中输入名称并回车时,实际发送的是Name\r\n,你只去掉了最后的\n,留下的\r会让输出光标跳转到行首,后续的消息内容会覆盖前面的字符,导致出现错乱的输出(比如: Hellod message: PRANESIMAS Name就是\r让光标回行首后,新内容覆盖了原有内容的结果)。

1. 彻底清理名称中的换行/回车符

不要只检查最后一个字符,直接定位并截断所有换行、回车符号,不管输入是\n、\r还是\r\n都能处理:

void getFullMessage(char *combinedMessage, size_t bufSize, char *message, char *name)
{
    // 找到第一个换行或回车的位置,截断字符串
    char *lineEnd = strpbrk(name, "\r\n");
    if (lineEnd != NULL) {
        *lineEnd = '\0';
    }

    printf("Name: %s\n", name);
    // 用snprintf替代sprintf,避免缓冲区溢出
    snprintf(combinedMessage, bufSize, "PRANESIMAS %s: %s", name, message);
    printf("Combined message: %s\n", combinedMessage);
}

2. 在接收阶段提前处理名称

更稳妥的方式是在读取客户端名称的环节就清理换行符,而非等到拼接消息时再处理:

char name_buf[256];
ssize_t read_len = read(client_socket, name_buf, sizeof(name_buf)-1);
if (read_len > 0) {
    name_buf[read_len] = '\0'; // 确保字符串以\0结尾
    char *lineEnd = strpbrk(name_buf, "\r\n");
    if (lineEnd != NULL) {
        *lineEnd = '\0';
    }
    // 保存清理后的name_buf供后续聊天使用
}

这样后续拼接消息时无需再处理名称的格式问题,减少出错概率。

3. 避免缓冲区溢出风险

原代码使用sprintf存在缓冲区溢出隐患,一旦combinedMessage的空间不足,会触发内存错误。换成snprintf并传入缓冲区大小,能保证写入的内容不会超出缓冲区范围,提升程序稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:12:33