我写了一个FTP客户端程序想下载文件,可发完 retr 命令后什么也收不到了,我的serv-u 上明明写着发送成功
“[3] Sat 18Oct03 19:06:34 - (000009) Sent file f:\mydoc\down\tt.txt successfully (1815 Kb/sec - 85499 bytes)
[5] Sat 18Oct03 19:06:34 - (000010) Closing connection”
一下是我的程序请大家帮帮忙.
//////////////////////////////////////////////
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
main()
{ WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)) {
printf("WSAStartup failed %s\n", WSAGetLastError());
return -1;
} SOCKET s=0;
s=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in from;
unsigned long ipValue=0;
int Port = 21;
char ipStr[255]={0}; //ipValue=inet_addr((char FAR*)ipStr);
ipValue=inet_addr("127.0.0.1");
from.sin_family=AF_INET;
from.sin_addr.S_un.S_addr=ipValue;
from.sin_port=htons(Port);
connect(s,(struct sockaddr FAR *)&from,sizeof(from)); char buffer[255]={0};
strcpy(buffer,"user test\r\n");
send(s,buffer,strlen(buffer),0);
strcpy(buffer,"pass test\r\n");
send(s,buffer,strlen(buffer),0); strcpy(buffer,"size tt.txt\r\n");
send(s,buffer,strlen(buffer),0);
recv(s,buffer,255,0); strcpy(buffer,"type i\r\n");
send(s,buffer,strlen(buffer),0);
recv(s,buffer,255,0); strcpy(buffer,"rest 0\r\n");
send(s,buffer,strlen(buffer),0);
recv(s,buffer,255,0); strcpy(buffer,"retr tt.txt\r\n");
send(s,buffer,strlen(buffer),0); recv(s,buffer,255,0);  一到这里就停住了????
         
closesocket(s);
WSACleanup();}

解决方案 »

  1.   

    注意,ftp协议是另外用一个端口来传送数据的,而不是21端口
      

  2.   

    用port或者pasv命令来指定端口,详细用法你自己查一下吧
      

  3.   

    Ftp协议规定,
    FTP信息交互的时候有两个途径:
    一个是命令通道(即你上面用的SOCKET)
    另一个是数据通道,用来传输数据:传输数据有两种模式:默认是主动方式,另一种是被动方式;
    因此你需要使用Port(主动)或者pasv(被动)命令来建立数据通道,建议一般使用pasv模式,这样才能保证,你的客户端在内网的时候,也能于外网的服务器建立数据通道。