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

WinSock2 recv无法读取全部大体积数据的问题求助

WinSock2 recv无法读取全部大体积数据的问题求助

大家好,我最近在做跨平台Socket数据传输的功能,用WinSock2在Windows客户端和跑在Wine上的Ubuntu服务端之间传输约10MB的大体积数据,结果遇到了接收卡住的问题,想请各位帮忙排查下。

先给大家展示相关的代码片段:

客户端接收数据代码

int expected_length = 0;
recv(m_Socket, (char*)&expected_length, 4, 0);
if (expected_length <= 0) return;

unsigned char* buffer = new unsigned char[expected_length];
int total_read = 0;
while (total_read < expected_length) {
    int to_read = expected_length - total_read;
    int count = recv(m_Socket, (char*)buffer + total_read, to_read, 0);
    if (count <= 0) {
        delete[] buffer;
        return nullptr;
    }
    total_read += count;
}

服务端发送数据代码

send(client_sock, (const char*)&nsize, 4, 0);
int total_sent = 0;
const char* ptr = buffer.data;
while (total_sent < nsize) {
    int rest = nsize - total_sent;
    int chunk = std::min(4096, rest);
    int sent = send(client_sock, ptr + total_sent, chunk, 0);
    if (sent < 0) break;
    std::cout << "sent: " << sent << ", total_sent: " << total_sent << std::endl;
    total_sent += sent;
}

客户端Socket初始化代码

WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

m_Socket = socket(AF_INET, SOCK_STREAM, 0);
if (m_Socket < 0) return false;

sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(25010);
inet_pton(AF_INET, "127.0.0.1", &servAddr.sin_addr);

if (connect(m_Socket, (sockaddr*)&servAddr, sizeof(servAddr)) < 0) return false;
return true;

具体问题现象:

  • 服务端的日志显示一直在正常分块发送数据,从输出看应该是发完了全部1008860字节
  • 客户端成功接收到开头的4字节长度字段,expected_length的值是正确的1008860
  • 客户端进入接收循环后,第一次recv调用返回了77380字节,但后续的recv直接卡住了——既不返回新数据,也没有抛出任何错误,就一直挂在那里

我检查过Socket初始化流程,用的是TCP流套接字,连接也能正常建立,实在找不到问题出在哪,有没有朋友遇到过类似情况,或者能帮我看看代码里的疏漏?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:27:58