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

C++ Socket程序发送消息后无法清空line缓冲区问题求助

问题分析与解决方案

你的代码存在几处逻辑问题,导致消息出现混杂,核心问题集中在对line数组的错误处理上:

  1. 错误的字符串截断:line[charCount - 1] = '\0';会直接删掉输入字符串的最后一个字符,若输入空行,charCount为0时还会触发数组越界,破坏内存。
  2. 冗余的换行符处理:std::cin.getline本身会自动丢弃输入末尾的换行符,额外用strcspn替换换行符属于多余操作,还可能干扰正常字符串。
  3. 未彻底清除数组残留:虽然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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:02:44