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
相关产品推荐
相关产品推荐

