unsigned short port = 0;
int len = 0, i = 0, j = 0, k = 0;
char temp[32] = "\0";
int dwRead = 0;
int dw = 0;
WSADATA cWSAData;
SOCKET comm_socket;                             /* 命令套接字 */
SOCKET data_socket;                             /* 数据套接字 */
struct sockaddr_in comm_addr;                   /* 命令传送地址 */
struct sockaddr_in data_addr;                   /* 数据传送地址结构 */
PHOSTENT hp;                                    /* 主机地址结构 */ int ret = 0;
char szServer[256] = "192.168.0.21";
char szPath[256] = "/ee";
char szUser[256] = "admin";
char szPwd[256] = "admin"; URL_COMPONENTS urlcom; char buf[MAX_ALLLEN];                          
char username[300];                          
char password[300];                          
char command[300];                             memset(buf, 0, MAX_ALLLEN);                
memset(username, 0, 300);                     
memset(password, 0, 300);                     
memset(command,0,256);                        
if(WSAStartup(MAKEWORD(2, 2), &cWSAData))       
return -1;
memset(&urlcom, 0, sizeof(URL_COMPONENTS));     
urlcom.dwStructSize = sizeof(URL_COMPONENTS); urlcom.lpszHostName = szServer;
urlcom.dwHostNameLength = 255;
urlcom.lpszUrlPath = szPath;
urlcom.dwUrlPathLength = 255;
urlcom.lpszUserName = szUser;
urlcom.dwUserNameLength = 255;
urlcom.lpszPassword = szPwd;
urlcom.dwPasswordLength = 255; ret = InternetCrackUrl(url, strlen(url), 0, &urlcom);
if(ret == FALSE)
return 1;
if ( !isdigit(szServer[0]) )        
{
hp = gethostbyname(szServer);
if (hp == NULL ) 
return 1;
memset(&comm_addr,0,sizeof(struct sockaddr_in));
memcpy(&comm_addr.sin_addr,hp->h_addr,hp->h_length);
comm_addr.sin_family = hp->h_addrtype;
comm_addr.sin_port = htons(urlcom.nPort);
}
else                               
{
memset(&comm_addr, 0, sizeof(comm_addr));
comm_addr.sin_addr.s_addr=inet_addr(szServer);
comm_addr.sin_family =AF_INET;
comm_addr.sin_port = htons(urlcom.nPort);
} comm_socket = socket(AF_INET,SOCK_STREAM,0); ret = connect(comm_socket, (struct sockaddr *)&comm_addr, sizeof(comm_addr)); if(ret == SOCKET_ERROR)
{
closesocket(comm_socket);
return 1;
}                                                                      
if (urlcom.lpszUserName[0] != 0)                                                              /* 如果FTP用户名不为空 */
sprintf(username,"USER %s\r\n","admin");   /* 设置ftp用户名 */
else
sprintf(username,"USER admin\r\n"); sprintf(password,"PASS %s\r\n","admin");   /* 设置ftp密码 */ send(comm_socket, username, strlen(username), 0);                                              /* 发送用户名到服务器 */
ret = recv(comm_socket,buf,100,0);                                                             /* 从服务器接收数据 */
printf("%s\n", buf);                                                                           /* 打印从服务器接收来的东西 */
Sleep(1000);                                                                                   /* 睡一秒钟 */
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
} memset(buf,0,100);
send(comm_socket, password, strlen(password), 0);                                              /* 向ftp服务器发送密码 */
ret = recv(comm_socket, buf, 100, 0);                                                          /* 从ftp服务器接收数据 */
printf("%s\n", buf);                                                                           /* 打印从服务器接收来的东西 */
Sleep(1000);
if(!strstr(buf, "\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
} //--二进制方式传输
memset(buf,0,100);
send(comm_socket, "TYPE I\r\n", 8, 0);                                                         /* 向服务器端发送验证 */
ret = recv(comm_socket,buf,100,0);                                                             /* 从服务器端接收 */
printf("%s\n", buf);                                                                           /* 打印从服务器接收来的东西 */
Sleep(1000);                                                                                   /* 睡一秒 */
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
} //--按被动访问模式访问
memset(buf,0,100);
send(comm_socket,"PASV\r\n",6,0);
ret = recv(comm_socket,buf,100,0);
printf("%s\n", buf);                                                                           /* 打印从服务器接收来的东西 */
Sleep(1000);
if(!strstr(buf, "\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
} //--远程主机文档大小
sprintf(command,"SIZE %s\r\n",szPath);
send(comm_socket, command, sizeof(command), 0);                                               /* 向服务器端发送命令 */
ret = recv(comm_socket,buf,100,0); printf("size %s\n", buf);                                                                     /* 打印从服务器接收来的东西 */
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
} GetPort(buf, &port); printf("得到的数据传输端口号是: %d\n", port); memset(&data_addr, 0, sizeof(data_addr));
data_addr.sin_addr.s_addr = inet_addr(szServer);
data_addr.sin_family = AF_INET;
comm_addr.sin_port = htons(port); data_socket = socket(AF_INET,SOCK_STREAM,0); ret = connect(data_socket, (struct sockaddr *)&comm_addr, sizeof(comm_addr));
  
if(ret == SOCKET_ERROR)
{
printf("数据连接错误\n");
closesocket(data_socket);
return 1;
} //--开始下载文件
memset(buf,0,100);
send(comm_socket,"CD\r\n",4,0);
ret = recv(comm_socket,buf,100,0); DWORD RE = GetLastError(); if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
                                 //--这个地方我不知道怎么做,怎么去下载了,请高手指点,谢谢 return 0;

解决方案 »

  1.   

    while (ret = recv(comm_socket, buf, 100, 0))
            if (ret == failed) break;
            file.write(buf, ...);
      

  2.   


    我拿socket写过ftp的下载,
     FTP客户端实现要建立两个通道,一个控制命令通道,让FTP服务器知道客户端要干什么,一个数据传输通道。所谓的两个通道只不过是两个调用了connect函数的连接,只是控制命令通道专门用来传输一些字符串命令信息,而数据通道则是用来传输文件。控制命令通道一定是由客户端向服务器的连接(默认的端口是21,也可以指定端口,这要看服务器的设置)。连接的过程完成了FTP的登录。如果你对FTP的传输原理不太清楚可以先看看
    http://www.2008red.com/member_pic_424/files/yuson/html/article_1407_1.shtml下载: 
    向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。客户端定位本地文件指针(文件末尾);两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件;
      

  3.   


    //--1向服务器发送“REST + 本地文件长度”命令,告诉服务器,客户端要断点下载了
    int  handle;
    long flen  ;
    char recvBuf[MAX_ALLLEN];
    char filname[256] ; strcpy(filname,"D:\\VAX.rar");
    handle  = open(filname,0);   
    flen    = filelength(handle);   close(handle); memset(buf,0,100);
    sprintf(command,"REST %d\r\n",flen);
    send(comm_socket,command,sizeof(command),0);   DWORD R = GetLastError(); ret = recv(comm_socket,buf,100,0);                    //--为什么到了这里就看不到返回了 if(ret==SOCKET_ERROR)
    {
    printf("发送文件大小命令失败\n");
    closesocket(comm_socket);
    return 1;
    } //--告诉要下载的文件名
    memset(buf,0,100);
    sprintf(command,"RETR %s\r\n","VAX.rar");
    send(comm_socket,command,sizeof(command),0);   DWORD R_1 = GetLastError(); ret = recv(comm_socket,buf,100,0); if(ret==SOCKET_ERROR)
    {
    printf("发送文件名失败\n");
    closesocket(comm_socket);
    return 1;
    }
      

  4.   

    最简单的方法是下载个flashfxp,看下人家的每一步命令是发送什么的,返回成功信息又是什么的,这不是一目了然了吗?
      

  5.   

    FTP,传输文件时,是另开一个SOCKET的.
    数据并不在你发送命令的那个SOCKET上传输,