recv()没有收到预期的字节数

时间:2014-04-19 00:06:03

标签: c++ sockets tcp winsock recv

我现在遇到的问题是:

int k = send( hAccepted, p, size, 0 );

'p'是一个缓冲区,包含一些文件,一个mp3,文本文件或者你有什么。问题是,如果有问题的文件是'5,000,000'字节,send()每次调用时都会返回5,000,000,即使接收端没有收到所有5,000,000字节。这使得在服务器端进行调试非常困难,因为客户端完全意识到它没有收到整个文件,但服务器确信它发送了整个文件。

1 个答案:

答案 0 :(得分:3)

send()返回传输到套接字发送缓冲区的字节数。如果返回50,000,则传输50,000个字节。如果您没有全部收到,问题出在接收方或网络中。

在进行任何进一步分析之前,您必须发布一些代码。

可能您希望在单个recv()调用中接收所有这些字节。它的规范没有义务这样做。你必须循环:

char buffer[8192];
int length = ... // number of bytes expected;
int total = 0;
int count;

while (total < length && (count = recv(socket, buffer, min(sizeof buffer, length-total), 0)) > 0)
{
    write(outfd, buffer, count);  // or do something else with buffer[0..count-1]
    total += count;
}
if (count < 0)
{
    perror("recv");
}

否则你在发送方做了一次失败的关闭,丢弃了飞行中的数据。

或者你在recv()期间遇到错误,并且没有在你的代码中检测到它。

或......