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

