C++ Socket程序发送消息后无法清空line缓冲区问题求助
问题分析与解决方案
你的代码存在几处逻辑问题,导致消息出现混杂,核心问题集中在对line数组的错误处理上:
- 错误的字符串截断:
line[charCount - 1] = '\0';会直接删掉输入字符串的最后一个字符,若输入空行,charCount为0时还会触发数组越界,破坏内存。 - 冗余的换行符处理:
std::cin.getline本身会自动丢弃输入末尾的换行符,额外用strcspn替换换行符属于多余操作,还可能干扰正常字符串。 - 未彻底清除数组残留:虽然
getline会覆盖部分数组内容并添加终止符,但如果上一次输入的字符串比当前长,数组末尾可能残留旧字符(虽不影响strlen判断,但显式清空更稳妥)。
修正后的代码
#include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <stdbool.h> #include <iostream> #include <cstring> const char* ip = "127.0.0.1"; int port = 1752; #pragma comment (lib, "ws2_32.lib") int main() { WSADATA wsadata; if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) { printf("[!] Winsock failed..\n"); exit(-1); } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { printf("[!] Socket creat was fail..\n"); WSACleanup(); exit(-1); } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_port = htons(port); inet_pton(AF_INET, ip, &(address.sin_addr)); if (connect(sock, (struct sockaddr*)&address, sizeof(address)) == SOCKET_ERROR) { printf("[!] Connect was fail.. \n"); closesocket(sock); WSACleanup(); exit(-1); } char buffer[1024]; char name[1024]; printf("Enter the username: \n"); std::cin.getline(name, sizeof(name)); name[strcspn(name, "\n")] = '\0'; char line[1024]; printf("Enter the messages: \n"); while (true) { // 每次循环开始前彻底清空line数组 memset(line, 0, sizeof(line)); std::cin.getline(line, sizeof(line)); // 跳过空行发送 if (strlen(line) == 0) { continue; } sprintf_s(buffer, sizeof(buffer), "%s: %s", name, line); if (send(sock, buffer, strlen(buffer), 0) == SOCKET_ERROR) { printf("[!] Send failed\n"); break; } } closesocket(sock); WSACleanup(); return 0; }
关键修改说明
- 添加
memset清空数组:每次调用getline前,用memset(line, 0, sizeof(line))将数组全部置0,彻底清除上一次的残留内容。 - 删除错误截断代码:去掉
line[charCount - 1] = '\0';,避免无端截断输入字符串。 - 优化资源释放顺序:先关闭socket再执行
WSACleanup,符合Winsock资源释放规范。 - 增加空行判断:跳过空行发送逻辑,避免无效消息传输。
内容的提问来源于stack exchange,提问作者user23044708
相关产品推荐
相关产品推荐

