C++ FTP服务器不处理'\r\n';正确地

C++ FTP服务器不处理'\r\n';正确地,c++,ftp,line-breaks,ftp-client,ftp-server,C++,Ftp,Line Breaks,Ftp Client,Ftp Server,我想请你们提个建议。我想用C/C++编写FTP客户端,我不想使用一些已经编写好的库,所以我决定自己编写。但我现在面临一个小问题 在服务器上发送任何数据时,一切正常,文件被创建并填充数据, 但是服务器完全忽略“\r\n”和“\n”符号。例如,我发送了一些包含许多行的文本文件, 但服务器将其连接到一条线路 我尝试了很多,但我不知道问题出在哪里。我已经尝试将文件从我的客户端发送到我的临时服务器(仅限recv()函数),并且该文件已正确保存。所以我不知道为什么FTP服务器会有这个问题 (我用Winsoc

我想请你们提个建议。我想用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;
}
int PutFile(char*filename)
{
流;
open(文件名,ios::in | ios::binary);
如果(!stream.is_open())
{
打印(“FTP_命令[info](%d):无法打开文件!”,uuu行);
返回-1;
}
int-sizeoffice=0;
int filepos=0;
seekg(0,ios::end);
sizeoffile=stream.tellg();
seekg(0,ios::beg);
如果(sizeoffile 0 | |(ptr=strrchr(文件名“\\”))>0)
{
memcpy(_文件名,(ptr+1),strlen((ptr+1));
}
其他的
{
memcpy(_文件名,文件名,strlen(文件名));
}
Pasv();
传输类型(ASCII);
SendCommand(“STOR”,文件名);
memset(ftpcommand_b,0,1500);
if(recv(ftpcommand,ftpcommand_b,1500,0)=套接字错误)
{
闭合插座(ftpcommand);
返回-1;
}
打印(“FTP_命令[in](%d):%s”,uu行,ftpcommandb);
int maxtime=3000;
setsockopt(ftpdata,SOL_SOCKET,SO_RCVTIMEO,(char*)maxtime,sizeof(int));
while(filepos!=sizeoffice)
{
int ssize=sizeoffice-filepos<1500?sizeoffice-filepos:1500;
打印(“FTP_数据[in](%d):数据大小:%d”,_行,ssize);
if(发送(ftpdata,&文件[filepos],ssize,0)=套接字错误)
{
打印(“FTP_数据[in](%d):发送数据失败!”,uuuu行_uuu);
闭合插座(ftpdata);
返回-1;
}
filepos+=ssize;
}
闭合插座(ftpdata);
memset(ftpcommand_b,0,1500);
if(recv(ftpcommand,ftpcommand_b,1500,0)=套接字错误)
{
闭合插座(ftpcommand);
返回-1;
}
打印(“FTP_命令[in](%d):%s ssize:%d”,uuu行,ftpcommand_ub,filepos);
stream.close();
返回0;
}
接收数据的功能工作起来很有魅力,但发送数据的功能并不多。 我知道我的代码并不完美,但我只是想了解FTP是如何工作的。 我当然要编辑我的代码:)


提前谢谢你

我解决了这个问题

问题不在于发送数据,而在于接收数据。在GetFile func中,我将TransferType设置为二进制,而不是发送数据时的ASCII,因此问题得到了解决:)


无论如何,谢谢你们的帮助!:)

您是否发送了将FTP服务器置于二进制模式的命令?谢谢。是的,问题仍然存在。请显示二进制模式下使用FTP的代码。您显示的代码仍然使用ASCII模式,但没有以与ASCII模式一致的格式发送文件内容。据我所知,二进制读取模式可用于ASCII文件和二进制文件。此代码也用于发送ASCII和二进制文件,但对于二进制文件,只是将
TransferType()
从ASCII
(a)
更改为二进制
(i)