我尝试制作一个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;
}
根本问题是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,被