再调用socket API进行传输时会涉及到很多细节的问题,其中一条便是文件传输的结尾判定。
这里的文件指广泛的文件而不单字符文件,因此无法使用EOF或者‘\0’来判定文件什么时候结束。
如果不进行恰当的判定,接收方将重复接收最后一个buf里面的内容。直至填满整个文件!
很多人提到了传输文件之前先发送文件长度。这样通过对比该长度与接收到的长度来判定是否继续写入文件。
这是一个比较麻烦,但是很好的机制,特别是对于二进制流传输的文件。
我一开始客户端添加进这一行:
#define MAX 1024
unsigned char buf[MAX];
while((fileBytes = recv(sockfd, buf, sizeof(buf), 0)) && (locallen < filelen)) {//filelen是服务器发送过来的文件长度
if(fileBytes == -1) {
perror("fail to receive datas\n");
exit(1);
}
fwrite(buf, sizeof(char), MAX, infp);
locallen += fileBytes;//已接收文件长度
}
</