由于使用TCP发送大数据或文件时容易发生数据丢失,其主要原因是在发送此类数据时,不能确保数据的每个字节都发送到接收方。
发送通常文件使用如下方式:
FILE *File = fopen(filePath, "rb");
if(NULL == File)
return false;
fseek(File, 0, SEEK_SET);
char Buff[1024] = {0};
int ulFaceReadByte;
while(!feof(File))
{
ulFaceReadByte = fread(Buff, 1, 1024, File);
send(s, Buff, ulFaceReadByte, 0);
}
fclose(File);
但是此方法不能够确保每次发送的数据都能成功,从而使得数据丢失。因此改进原有方式为:
FILE *File = fopen(filePath, "rb");
if(NULL == File)
return false;
fseek(File, 0, SEEK_SET);
char Buff[1024] = {0};
int ulFaceReadByte;
while(!feof(File))
{
ulFaceReadByte = fread(Buff, 1, 1024, File);
while(!send(s, Buff, ulFaceReadByte, 0) ) ;
}
fclose(File);
增加一条while语句确保将所有的数据都发送出去。
同理发送大数据时也是增加while(!send(s, Buff, ulFaceReadByte, 0) );