我现在遇到的问题是:
int k = send( hAccepted, p, size, 0 );
'p'是一个缓冲区,包含一些文件,一个mp3,文本文件或者你有什么。问题是,如果有问题的文件是'5,000,000'字节,send()每次调用时都会返回5,000,000,即使接收端没有收到所有5,000,000字节。这使得在服务器端进行调试非常困难,因为客户端完全意识到它没有收到整个文件,但服务器确信它发送了整个文件。
答案 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()期间遇到错误,并且没有在你的代码中检测到它。
或......