Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件传输返回奇怪的字符_C++_Sockets_File_Tcp_Transfer - Fatal编程技术网

C++ 文件传输返回奇怪的字符

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

所以我尝试创建一个简单的文件传输方法。它完全适用于小文件(几个字节)。但是如果我想传输一个2KB大小的文件,它会返回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);
你正在发送文件大小的字节,但你甚至不知道你读了多少。检查读取的返回值,不要对此使用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上工作。