所以我正在尝试创建一个简单的文件传输方法。它完全适用于小文件(几个字节)。但是如果我要传输大小为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
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
ðº
𺫫««««««îþîþ
答案 0 :(得分:3)
为什么:
fread_s(mfcc, 1499, sizeof(char), 1499, fp);
send(Socket, mfcc, FileSize, 0);
您正在发送FileSize字节,但您甚至不知道自己读了多少。检查读取的返回值,不要使用strlen(),因为你不知道文件是否包含0个字节。
答案 1 :(得分:0)
修正了它。换行符大小为2个字节,但我的程序只将其计为一个。我想这是因为Filesize和Sizecheck之间的区别实际上是文件中的行数。
新循环:
char* mfcc;
mfcc = (char*)malloc(FileSize + 1);
while(SizeCheck {issmallerthan} FileSize){
int Received = recv(mySocket, mfcc, FileSize, 0);
int Written = fwrite(mfcc, sizeof(char), Received, fp);
SizeCheck += Written;
for(int i = 0; i {issmallerthan} Written; i++){
if(mfcc[i] == '\n'){
SizeCheck += 1;
}
}
}
fclose(fp);
free(mfcc);
发件人部分就像这样。
感谢大家的帮助。 :3
案件结案。 :d