求论坛高手指点啊,PASV(被动方式)命令发送后,为什么程序不往下走,卡住了?

时间:2021-02-21 14:39:35
   我采用控制台程序用winsock基本命令按照FTP协议与FTP服务器建立联系,并试图遍历目录,但在成功连接并登陆后,发送PASV(被动方式)后,为什么卡住了(就是不往下走了,怎么设断点也不往下走),下一条命令(TYPE I 或LIST)无法执行?


    ::send(s,"USER myway\r\n",sizeof("USER myway\r\n"),0);
    ::recv(s,sztext1,sizeof(sztext1),0);
    printf(sztext1);
    ::send(s,"PASS 123\r\n",sizeof("PASS 123\r\n"),0);
    ::recv(s,sztext2,sizeof(sztext2),0);
    printf("%S\n",sztext2);
    getchar();
    ::send(s,"PWD \r\n",sizeof("PWD \r\n"),0);
    ::recv(s,sztext3,sizeof(sztext3),0);
    printf("%S\n",sztext3);
    getchar();
    char szTemp1[64]; 
    memset(szTemp1,0,64);
::send(s,"PASV \r\n",sizeof("PASV \r\n"),0);    
    int error1=::recv(s,szTemp1,64,0);
    printf("%s\r\n",szTemp1);
    port =chartoint(szTemp1);               //自己编的函数,用于向服务器务器返回的应答获取端口号
   ::send(s,"LIST \r\n",sizeof("LIST \r\n"),0);
   int error=::recv(s,szTemp,64,0);
   printf(szTemp);
   hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);   //此线程用于建立数据连接,接收像LIST命令返回的数据 CloseHandle(hThread1);
    
if(hThread1==NULL)
{
cout<<"创建线程失败!"<<endl;
}
    if(getchar())
   {
    return 0; //正常结束程序
   }
    else
   {
     Sleep(100);
   }
    ::closesocket(s); //关闭套接字句柄
    ::WSACleanup();
    Sleep(100);

5 个解决方案

#1


我来帮顶 虽然不会

#2


ftp协议中有2条连接,一条是控制连接,一条是数据连接,建议好好研究下ftp协议。
当发送PASV之后,返回“227 Entering Passive Mode (192,168,1,2,4,18)”。这意味着在服务器上有一个端口被开放,他将为我们后面接着的数据传输作好准备,但是我们如何知道该端口号呢,就在(192,168,1,2,4,18)中,前面四位指服务器的地址,关键是最后两位,将最后第二位乘256再加上最后一位的值就是我们的端口号,也就是4*256+18。取得端口号之后我们就可以用socket连接到这里。这为我们后面的工作作好准备了,因为我们的取得列表,上传,下载文件都要依靠它来实现。

#3


引用 2 楼 flandy_feng 的回复:
ftp协议中有2条连接,一条是控制连接,一条是数据连接,建议好好研究下ftp协议。
当发送PASV之后,返回“227 Entering Passive Mode (192,168,1,2,4,18)”。这意味着在服务器上有一个端口被开放,他将为我们后面接着的数据传输作好准备,但是我们如何知道该端口号呢,就在(192,168,1,2,4,18)中,前面四位指服务器的地址,关键是最后两位,将最后第二……

这个我知道,协议我已经看过,这个问题我已经解决,但是我在试图用CWD 进入子目录,后再输入个PASV命令打开另外个服务器数据端口,我用第二个线程用recn接收数据时接收不着啊,后我用Wireshark拦截包,发现个奇怪的现象,就是数据端口(第二个PASV命令后)打开了,但既不知传到哪里去了,又好像没有什么我期望数据。专家请解答!

#4


服务器的端口打开了,你和服务器这个临时端口之间建立了连接了吗?

#5


问题已找到,谢谢!

#1


我来帮顶 虽然不会

#2


ftp协议中有2条连接,一条是控制连接,一条是数据连接,建议好好研究下ftp协议。
当发送PASV之后,返回“227 Entering Passive Mode (192,168,1,2,4,18)”。这意味着在服务器上有一个端口被开放,他将为我们后面接着的数据传输作好准备,但是我们如何知道该端口号呢,就在(192,168,1,2,4,18)中,前面四位指服务器的地址,关键是最后两位,将最后第二位乘256再加上最后一位的值就是我们的端口号,也就是4*256+18。取得端口号之后我们就可以用socket连接到这里。这为我们后面的工作作好准备了,因为我们的取得列表,上传,下载文件都要依靠它来实现。

#3


引用 2 楼 flandy_feng 的回复:
ftp协议中有2条连接,一条是控制连接,一条是数据连接,建议好好研究下ftp协议。
当发送PASV之后,返回“227 Entering Passive Mode (192,168,1,2,4,18)”。这意味着在服务器上有一个端口被开放,他将为我们后面接着的数据传输作好准备,但是我们如何知道该端口号呢,就在(192,168,1,2,4,18)中,前面四位指服务器的地址,关键是最后两位,将最后第二……

这个我知道,协议我已经看过,这个问题我已经解决,但是我在试图用CWD 进入子目录,后再输入个PASV命令打开另外个服务器数据端口,我用第二个线程用recn接收数据时接收不着啊,后我用Wireshark拦截包,发现个奇怪的现象,就是数据端口(第二个PASV命令后)打开了,但既不知传到哪里去了,又好像没有什么我期望数据。专家请解答!

#4


服务器的端口打开了,你和服务器这个临时端口之间建立了连接了吗?

#5


问题已找到,谢谢!