所以我正在尝试创建一个简单的文件传输方法。它完全适用于小文件(几个字节)。但是如果我想传输一个大小为 2 kB 的文件,它会返回 unicode 字符而不是文件中的内容。
服务器:
void DownloadFile(SOCKET Socket){
if(Socket == NULL){
return;
}
while(1){
char filename[1024];
recv(Socket, filename, sizeof(filename), 0);
if(filename[0] == '.'){
break;
}
FILE* fp = fopen(filename, "r");
fseek(fp, 0, SEEK_END);
long FileSize = ftell(fp);
char GotFileSize[1024];
_itoa_s(FileSize, GotFileSize, 10);
send(Socket, GotFileSize, 1024, 0);
rewind(fp);
long SizeCheck = 0;
char* mfcc;
if(FileSize > 1499){
mfcc = (char*)malloc(1500);
while(1){
if(SizeCheck >= FileSize){
fclose(fp);
Sleep(500);
free(mfcc);
break;
}
fread_s(mfcc, 1499, sizeof(char), 1499, fp);
send(Socket, mfcc, FileSize, 0);
SizeCheck += strlen(mfcc);
}
}
else{
mfcc = (char*)malloc(FileSize + 1);
fread_s(mfcc, FileSize, sizeof(char), FileSize, fp);
send(Socket, mfcc, FileSize, 0);
fclose(fp);
Sleep(500);
free(mfcc);
}
}
return;
}
客户:
void DownloadFile(SOCKET Socket){
if(Socket == NULL){
return;
}
while(1){
printf("Input local filename: ");
char localfile[1024];
gets_s(localfile, 1024);
if(localfile[0] == '.'){
send(mySocket, localfile, sizeof(localfile), 0);
break;
}
printf("Input remote filename: ");
char filename[1024];
gets_s(filename, 1024);
if(filename[0] == '.'){
send(mySocket, filename, sizeof(filename), 0);
break;
}
send(mySocket, filename, sizeof(filename), 0);
char GotFileSize[1024];
recv(mySocket, GotFileSize, 1024, 0);
long FileSize = atoi(GotFileSize);
long SizeCheck = 0;
FILE *fp = fopen(localfile, "w");
char* mfcc;
if(FileSize > 1499){
mfcc = (char*)malloc(1500);
while(1){
if(SizeCheck >= FileSize){
fclose(fp);
Sleep(500);
free(mfcc);
break;
}
recv(mySocket, mfcc, 1499, 0);
fprintf(fp, "%s", mfcc);
SizeCheck += strlen(mfcc);
}
}
else{
mfcc = (char*)malloc(FileSize + 1);
recv(mySocket, mfcc, FileSize, 0);
fprintf(fp, "%s", mfcc);
fclose(fp);
Sleep(500);
free(mfcc);
}
}
}
现在,如果我传输这个文件:
Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
传输的文件包含以下内容:
Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
𺫫««««««îþîþtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesº««««««««îþîþttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
𺫫««««««îþîþ
最佳答案
为什么这样:
fread_s(mfcc, 1499, sizeof(char), 1499, fp);
send(Socket, mfcc, FileSize, 0);
您正在发送 FileSize 字节,但您甚至不知道您已经阅读了多少。检查读取的返回值,不要为此使用 strlen() 因为您不知道文件是否包含 0 字节。
关于c++ - 文件传输返回奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449450/