You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++ TCP Socket服务端接收空缓冲区问题排查求助

问题排查与修复方案

嘿,我一眼就看到了服务端代码里的几个关键问题,这就是你一直收到空缓冲区的核心原因:

1. 接收缓冲区的致命错误

你在服务端里写了 char* buffer = "";,这直接导致了接收失败,有两个严重问题:

  • 这个buffer指向的是只读的空字符串字面量,就算recv尝试写入数据,也会触发内存访问错误;
  • 调用recv时第三个参数用了(int)strlen(buffer),空字符串的长度是0——等于你明确告诉操作系统“我只想接收0字节的数据”,那自然收不到任何内容!

修复后的接收代码

把缓冲区改成可写的数组,并且传入正确的缓冲区大小:

// 创建一个足够大的缓冲区,初始化全为0
char buffer[1024] = {0};
// 接收时传入缓冲区的实际可用大小,减1是为了留位置放字符串终止符
iResult = recv(AcceptSocket, buffer, sizeof(buffer)-1, 0);
if (iResult == SOCKET_ERROR) {
    printf("recv function failed with error: %d\n", WSAGetLastError());
    closesocket(AcceptSocket); // 注意这里要关闭的是AcceptSocket,不是未定义的_server
    WSACleanup();
    return 1;
}
else if (iResult > 0) {
    // 手动添加字符串终止符,确保printf能正确输出
    buffer[iResult] = '\0';
    printf("received data:\n");
    printf("%s\n", buffer);
}
else if (iResult == 0) {
    printf("Client has closed the connection.\n");
}

2. 未定义变量导致的错误

服务端的错误处理里写了closesocket(_server);,但整个代码里根本没有定义_server这个变量!你应该关闭的是用来和客户端通信的AcceptSocket,不然会导致编译错误或者资源泄漏。

3. 客户端的小兼容优化

客户端用的是WSAStartup(MAKEWORD(2, 0), &WSAData);,虽然能运行,但建议和服务端保持一致用MAKEWORD(2, 2),避免潜在的Winsock版本兼容问题。

额外测试提醒

测试的时候一定要先启动服务端,等它输出“Waiting for client to connect...”后再启动客户端,这样连接和数据传输才能正常完成。

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

火山引擎 最新活动