簡體   English   中英

FTP服務器無法正確處理'\\ r \\ n'

[英]FTP server does not handle '\r\n' correctly

我想請你們提供建議。 我想用C / C ++編寫FTP客戶端,我不想使用某些已經編寫的庫,所以我決定全部由我自己編寫。 但是我現在面臨一個小問題。

在服務器上發送任何數據期間,一切正常,該文件已創建並充滿了數據,但是服務器完全忽略了'\\ r \\ n'和'\\ n'符號。 例如,我發送了許多行的文本文件,但是服務器將其連接到一行。

我已經嘗試了很多,但是我不知道問題可能在哪里。 我已經嘗試過將文件從客戶端發送到我的臨時服務器(僅recv()函數),並且該文件已正確保存。 所以我不知道為什么FTP服務器有問題。

(我在Winsock 2中做所有事情)

這是從我的客戶端發送文件的功能:

int PutFile(char *filename)
{
    fstream stream;
    stream.open(filename, ios::in | ios::binary);
    if(!stream.is_open())
    {
        Print("FTP_COMMAND[info]( %d ): Could not open file!", __LINE__);
        return -1;
    }
    int sizeoffile = 0;
    int filepos = 0;
    stream.seekg(0, ios::end);
    sizeoffile = stream.tellg();
    stream.seekg(0, ios::beg);

    if(sizeoffile <= 0)
    {
        Print("FTP_COMMAND[in]( %d ): Invalid file!", __LINE__);
        return -1;
    }

    char *file = new char[sizeoffile + 1];
    memset(file, 0, sizeoffile + 1);
    stream.read(file, sizeoffile);

    char _filename[512];
    memset(_filename, 0, 512);

    char *ptr = 0;
    if((ptr = strrchr(filename, '/')) > 0 || (ptr = strrchr(filename, '\\' ) ) > 0 )
    {
        memcpy(_filename, (ptr + 1), strlen((ptr + 1)));
    }
    else
    {
        memcpy(_filename, filename, strlen(filename));
    }

    Pasv();
    TransferType(ASCII);

    SendCommand("STOR", _filename);
    memset(ftpcommand_b, 0, 1500);
    if(recv(ftpcommand, ftpcommand_b, 1500, 0) == SOCKET_ERROR)
    {
        closesocket(ftpcommand);
        return -1;
    }
    Print("FTP_COMMAND[in]( %d ): %s", __LINE__, ftpcommand_b);

    int maxtime = 3000;
    setsockopt(ftpdata, SOL_SOCKET, SO_RCVTIMEO, (char*)maxtime, sizeof(int));

    while(filepos != sizeoffile)
    {
        int ssize = sizeoffile - filepos < 1500 ? sizeoffile - filepos : 1500;
        Print("FTP_DATA[in]( %d ): Data size: %d", __LINE__, ssize);

        if(send(ftpdata, &file[filepos], ssize, 0) == SOCKET_ERROR)
        {
            Print("FTP_DATA[in]( %d ): Failed to send data!", __LINE__);
            closesocket(ftpdata);
            return -1;
        }
        filepos += ssize;
    }

    closesocket(ftpdata);

    memset(ftpcommand_b, 0, 1500);
    if(recv(ftpcommand, ftpcommand_b, 1500, 0) == SOCKET_ERROR)
    {
        closesocket(ftpcommand);
        return -1;
    }
    Print("FTP_COMMAND[in]( %d ): %s ssize: %d", __LINE__, ftpcommand_b, filepos);
    stream.close();
    return 0;
}

接收數據的功能就像一個符咒,但發送數據的功能卻不是很多。 我知道我的代碼並不完美的事實,但是我只是想了解FTP的工作原理。 我當然要編輯我的代碼:)

先感謝您!

我解決了這個問題。

問題不在於發送數據,而在於接收數據。 在GetFile函數中,我將TransferType設置為二進制,而不是發送數據時的ASCII,因此問題得以解決:)

無論如何,謝謝你們的幫助! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM