C++ 文件传输返回奇怪的字符
所以我尝试创建一个简单的文件传输方法。它完全适用于小文件(几个字节)。但是如果我想传输一个2KB大小的文件,它会返回unicode字符,而不是文件中的字符 服务器:C++ 文件传输返回奇怪的字符,c++,sockets,file,tcp,transfer,C++,Sockets,File,Tcp,Transfer,所以我尝试创建一个简单的文件传输方法。它完全适用于小文件(几个字节)。但是如果我想传输一个2KB大小的文件,它会返回unicode字符,而不是文件中的字符 服务器: void DownloadFile(SOCKET Socket){ if(Socket == NULL){ return; } while(1){ char filename[1024]; recv(Socket, filename, sizeof(filen
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);
你正在发送文件大小的字节,但你甚至不知道你读了多少。检查读取的返回值,不要对此使用strlen(),因为您不知道文件是否包含0字节。为什么:
fread_s(mfcc, 1499, sizeof(char), 1499, fp);
send(Socket, mfcc, FileSize, 0);
你正在发送文件大小的字节,但你甚至不知道你读了多少。检查读取的返回值,不要对此使用strlen(),因为您不知道文件是否包含0字节。修复了它。换行符的大小为2字节,但我的程序只将其计算为1字节。我这样做是因为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);
发送方部分与此类似
谢谢大家的帮助三,
结案:D修复了它。换行符的大小为2字节,但我的程序只将其计算为1字节。我这样做是因为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);
发送方部分与此类似
谢谢大家的帮助三,
结案:D对于这类问题,我通常建议人们用十六进制打印值以提高可读性:fprintf(fp,“0x%x”,mfcc);我发现默认的套接字大小是1500字节。因此,如果文件大于1500字节,请将其拆分为块。不过我可能做错了@Karlphillip:我试试。@karl但是打印缓冲区的内存偏移量有什么用呢?(mfcc是一个指针.)@Waza:如果你调用
send
你需要告诉它你想发送多少。如果你调用read
,它会告诉你它实际读了多少。因此,获取读取的返回值,并将其传递给send,而不是FileSize。(另外,请养成经常检查所有返回值的习惯)@waza:是的,我指的是这些东西通常是如何工作的;以下内容绝对不能取代正确的解释,但简而言之:read
-like函数给出读取的字节数,而您必须给send
-或write
-like函数指定要写入的字节数。在您的环境中尝试fwrite
或fwrite\u
write
like函数将套接字和数据视为流,send
like函数将其视为发送数据包的通道。以f开头的函数。
通常用于流指针,没有f
的函数通常用于原始fd。对于此类问题,我通常建议人们以十六进制打印值以提高可读性:fprintf(fp,“0x%x”,mfcc);我发现默认的套接字大小是1500字节。因此,如果文件大于1500字节,请将其拆分为块。不过我可能做错了@Karlphillip:我试试。@karl但是打印缓冲区的内存偏移量有什么用呢?(mfcc是一个指针.)@Waza:如果你调用send
你需要告诉它你想发送多少。如果你调用read
,它会告诉你它实际读了多少。因此,获取读取的返回值,并将其传递给send,而不是FileSize。(另外,请养成经常检查所有返回值的习惯)@waza:是的,我指的是这些东西通常是如何工作的;以下内容绝对不能取代正确的解释,但简而言之:read
-like函数给出读取的字节数,而您必须给send
-或write
-like函数指定要写入的字节数。在您的环境中尝试fwrite
或fwrite\u
write
like函数将套接字和数据视为流,send
like函数将其视为发送数据包的通道。以f..
开头的函数通常在流指针上工作,没有f
的函数通常在原始fd上工作。