当前位置: 首页 > 知识库问答 >
问题:

425无法打开我的程序上的数据连接,而Filezilla工作

琴俊良
2023-03-14

我尝试制作一个FTP客户端,它在活动模式下上传一个文件(C和linux的socket库)。当我想在本地服务器(LAN)上发送文件时,我的程序工作,但当我想在远程服务器(WAN)上发送文件时,它不工作。我有一个错误425无法打开数据连接。我做了很多研究,通常这个问题来自NAT(它可能会阻塞数据连接端口)。但是我试过使用Filezilla(在活动模式下),它成功了。所以我没有发现数据连接的问题在哪里。

这是我的代码:

using namespace std;
int sock;
int sock_data,new_sock;
struct sockaddr_in sin_data;
struct sockaddr_in cli_addr = {0};

char* receiving(int socket)
{
    char message[1000] = {'/0'};
    recv(socket,message,sizeof(message),0);
    cout << message << endl;
    return message;
}

void *send_data(void* args)
{
    send(sock,"STOR fichier.txt\r\n",sizeof("STOR fichier.txt\r\n"),0);
    receiving(sock);
    return(0);
}

void *accept_data_connexion(void* args)
{
    sock_data = socket(AF_INET,SOCK_STREAM,6);
    sin_data.sin_family = AF_INET;
    sin_data.sin_port = htons(58703);
    sin_data.sin_addr.s_addr = INADDR_ANY;
    socklen_t clilen = sizeof(cli_addr);
    new_sock = accept(sock_data,(struct sockaddr *)&cli_addr,&clilen);
    if(errno == 0)
        {
        cout << "Data connection is established" << endl;
        }
}

int main()
{
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(21);
    sin.sin_addr.s_addr = inet_addr("xxx,xxx,xxx,xxx");
    sock = socket(AF_INET,SOCK_STREAM,6);
    //connection
    connect(sock,(struct sockaddr *)&sin,sizeof(sin));
    receiving(sock);
    receiving(sock);
    print_box();
    //log in
    send(sock,"USER username\r\n",sizeof("USER username\r\n"),0);
    receiving(sock);
    send(sock,"PASS password\r\n",sizeof("PASS password\r\n"),0);
    receiving(sock);

    send(sock,"SYST\r\n",sizeof("SYST\r\n"),0);
    receiving(sock);
    send(sock,"PWD\r\n",sizeof("PWD\r\n"),0);
    receiving(sock);
    send(sock,"PORT xxx,xxx,xxx,xxx,229,79",sizeof("PORT xxx,xxx,xxx,xxx,229,79"),0);
    receiving(sock);
    send(sock,"TYPE I \r\n",sizeof("TYPE I \r\n"),0);
    receiving(sock);

    pthread_t th1, th2;
    void *ret;
    pthread_create (&th1,NULL, accept_data_connexion,(void*)1);
    pthread_create (&th2, NULL, send_data,(void *)2);
    (void)pthread_join (th1, &ret);
    (void)pthread_join (th2, &ret);

    ifstream fichier("fichier.txt");
    int i = 0;
    while(fichier.eof() == false)
     {
        fichier.seekg(i,fichier.beg);
        char* buffer= new char[1];
        fichier.read(buffer,1);
        write(new_sock,buffer,1);
        i++;
     }

    fichier.close();
    close(new_sock);
    close(sock_data);
    close(sock);
    return 0;
}

共有1个答案

颛孙沈义
2023-03-14

根本问题是accept\u data\u connexion()没有调用bind()listen()来实际打开数据端口,然后调用accept()来接收数据连接。

您所展示的总体上是一个糟糕的实现。你犯了很多错误。误用sizeof()。套接字API和FTP协议中都缺少错误处理。内存泄漏。在不需要线程的地方使用线程。你真的需要退一步想想你在做什么。要么从头开始重新编写这段代码以正确地完成工作,要么使用第三方库为您处理细节,例如libcurl。

 类似资料:
  • 我需要编写一个连接到FTP服务器的应用程序。此FTP服务器不允许被动模式连接。我可以使用Filezilla连接到FTP服务器。 我开发了一个C#WCF服务,它使用FTPWebRequest类连接到此FTP服务器。以下是FTPWebRequest对象的基本设置: 当我从Visual Studio(Ctrl F5)运行WCF服务时,它连接到FTP服务器并下载所需的文件,没有任何问题 但是,当我在本地I

  • 我用这个上传一些文件。如果我在本地连接中,它可以工作,但如果我使用外部连接,我会收到以下消息:

  • 我正在使用Teamcity在FTP中部署我的Web应用程序。在周一之前,部署工作一直很顺利。现在它不再工作了。我没有对Teamcity做任何更改。问题:FTP传输正常启动。一些文件被传输。然后它会中断FTP错误:“425无法打开数据连接”。FTP部署在我的所有其他Web应用程序上都可以正常工作。关于这个问题你能给我一个提示吗?teamcity步骤配置 日志: [13:57:10]i:[步骤1/1]

  • 我正在使用Teamcity在FTP中部署我的Web应用程序。在周一之前,部署工作非常顺利。现在它不再起作用了。我没有对团队城做任何修改。问题:FTP传输正常启动。有些文件被转移。然后它以FTP错误中断:“425无法打开数据连接”。FTP部署在我的所有其他Web应用程序上都运行良好。你能给我一个关于这个问题的提示吗?TeamCity step配置 日志: [13:57:10]I:[步骤1/1]<25

  • 我使用Windows服务器Xampp 1.8.3和安装FileZilla FTP服务器= 我打开端口20,21,30。

  • 我想将我的Azure Web应用程序创建的文件传输到Azure网络之外的FTP服务器。我得到的只是FTP上的0字节文件和Web应用程序上的“425无法打开数据连接”错误。 Azure Web应用程序或FTP服务器上是否缺少设置?在我的本地IIS Express上使用相同的Web应用程序可以正常工作。该Web应用程序使用ASP。NETMVC5。 编辑1: 这是我用来发送文件的代码: 根据MSDN,被