425 无法在我的程序上打开数据连接,而 Filezilla 工作
425 Can't open data connection on my program whereas Filezilla work
我尝试制作一个FTP客户端,该客户端在活动模式下上传文件(使用linux的套接字库的C++)。当我想在本地服务器(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.txtrn",sizeof("STOR fichier.txtrn"),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 usernamern",sizeof("USER usernamern"),0);
receiving(sock);
send(sock,"PASS passwordrn",sizeof("PASS passwordrn"),0);
receiving(sock);
send(sock,"SYSTrn",sizeof("SYSTrn"),0);
receiving(sock);
send(sock,"PWDrn",sizeof("PWDrn"),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 rn",sizeof("TYPE I rn"),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_data_connexion()
在调用accept()
接收数据连接之前,没有调用bind()
和listen()
来实际打开数据端口。
总的来说,您所展示的是一个糟糕的实现。你犯了很多错误。sizeof()
的误用。在套接字API和FTP协议中都缺乏错误处理。内存泄漏。在不需要的地方使用线程。你真的需要退后一步,想想你在做什么。要么从头开始重写这些代码以正确地完成任务,要么使用第三方库为您处理细节,例如libcurl。
相关文章:
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- 数据库连接并将数据从C ++程序保存到MySQL
- 连接到远程存储库并获取数据
- 如何使用 TCP 连接发送大块数据
- 连接UDP套接字,但仍然接收来自其他源的数据报
- 从多个 tcp 连接读取数据
- 将文本和二进制数据连接到一个文件中
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 如何通过解析缓冲区并将数据放入正确的结构来处理传入的数据包连接?
- TCP 连接中的超时,没有数据交换
- 如何将 Matlab 与 Visual Studio 连接以进行实时数据交换?
- QNETWORK停止连接并检索数据
- 在服务器关闭的TCP连接上发送数据时的行为不一致
- 使用 Python 连接到数据流
- 是STL中的联合获取(或不连接集)数据结构
- 使用Isringstream和struct/vector在给定的数据之间建立连接
- Adafruit Fona与echo服务器建立连接,但不发送任何数据
- C++ OpenMP:将 for 循环拆分为静态偶数块,并在最后连接数据