免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1712 | 回复: 9
打印 上一主题 下一主题

ftp问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-06 11:59 |只看该作者 |倒序浏览
以前没写过FTP程序,现在做一个简单的客户端,
想问下写过的朋友,登陆的时候是如何把用户和
密码send上去的.


  1. send(sockfd, "user", 4, 0);
  2. send(sockfd, "pass", 4, 0);
复制代码

这样好象不行.

如果哪位朋友有这方面的demo程序,方便的话
给我发一个leberco@sina.com,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-04-06 12:02 |只看该作者
user 后免应该有 用户名吧??

论坛徽章:
0
3 [报告]
发表于 2007-04-06 12:06 |只看该作者
// FTP.cpp : 定义控制台应用程序的入口点。
//





//=======================


//演示代码,没有错误处理,尽量简化了流程




//=========================
#include "stdafx.h"
#include <winsock.h>
#include <windows.h>
#include <stdio.h>
#pragma comment (lib,"Ws2_32"

//====以下是STL库
#include <string>
#include <vector>
#include <algorithm>


using namespace std;


//因为是演示代码,所以申明了全局变量,请不要效仿

    char Buff[1024];

    SOCKET listenFD=NULL;

//================================

    int recvbuff()
    {
   
   
        ZeroMemory(Buff,1024); //清0

        int ret =  recv(listenFD,Buff,1024,0);

        printf(Buff);

        return 0;
   
    }


int main(int argc, char *argv[])
{

   
   



  struct sockaddr_in my;


  my.sin_family=AF_INET;

  my.sin_addr.s_addr=inet_addr("192.168.18.119";

  my.sin_port=htons(21);

  WSADATA wsadata;
  BOOL ThreadFlag=FALSE;
  DWORD ThreadID=0;
  int nRet=0;

  nRet=WSAStartup(MAKEWORD(2,2),&wsadata);    //初始化



  listenFD=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);


      while (1)
    {
        nRet=connect(listenFD,(struct sockaddr*)&my,sizeof (struct sockaddr));


        if (nRet!=SOCKET_ERROR)
        {
            
          break;
                             
        }

    }

    recvbuff(); //接收服务器版本信息
      
    //==================================
   
    char user[] = "USER admin\r\n";
    char pass[] =  "admin\r\n";

    send(listenFD,user,sizeof(user),0);

    recvbuff();


    //==========================================

   
    send(listenFD,pass,sizeof(pass),0);

    recvbuff();     


//=================================

    char type[] = "TYPE I\r\n";      

    send(listenFD,type,sizeof(type),0);  //更改传输类型为二进制

    recvbuff();

    //==========================================

    //更改路径命令是 CWD

    //================================
    char pasv[] = "ASV\r\n";      

    send(listenFD,pasv,sizeof(pasv),0);  //更改传输类型为二进制

    recvbuff();

    //=======================================
   


    //以下代码摘自我的FTP客户端,使用了 string 对象,

    //作用是处理服务器发回的 PASV 信息,得到把其中的IP和端口

    //发回的格式为    227 Entering Passive Mode (192,168,18,119,11,7..
      
    // 192,168,18,119 = 192.168.18.119
     
    //  端口 = 11*256 + 78

    //========================================
      
      string ifstr = Buff;  //把返回信息传给 string 对像,string 是STL中的字符串对象


      string::size_type pos = 0;                      //长度,当整型吧,size_type是为了跨平台
      
        string::size_type slen = ifstr.find("("+1;    // find 是指查找字符 "(" 的位置,返回长度

        string::size_type dlen = 0 ;
   
        int i = 0 ;

        for( i ; i < 4 ; i++)                            //把IP地址中的 "," 换成 "."
        {
            dlen = ifstr.find(",",dlen);

            ifstr.replace(dlen,1,".";

            dlen++;           
        }
      

        string ip = ifstr.substr(slen,dlen-slen-1);    //把IP地址提出来

        //====================================        //把端口提出来
      
        string temport;

        u_short uport;

        slen = dlen;
      
        dlen = ifstr.find(",";

        temport = ifstr.substr( slen , dlen - slen); //slen 起始地址,第二参数表示 以第一个地址copy出的字节数

        uport = atoi( temport.c_str()) * 256 ;
        //=====================================

        slen = dlen + 1;

        dlen = ifstr.find("",slen) ;

        temport = ifstr.substr(slen,dlen - slen);

        uport += atoi( temport.c_str());

        //====================================
      

        //分析返回的PASV信息完成,开始数据通道连接

        //===================================


        SOCKET ssock=NULL;

        ssock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

      
      struct sockaddr_in server;

   
      server.sin_family=AF_INET;

      server.sin_addr.s_addr=inet_addr(ip.c_str());
     
      server.sin_port=htons(uport);



    while (1)
    {
        nRet=connect(ssock,(struct sockaddr*)&server,sizeof (struct sockaddr));


        if (nRet!=SOCKET_ERROR)
        {
            
          break;
                             
        }

    }



    printf("数据通道连接成功\n";






    //==============================================




    //==========================================


    char stor[] = "STOR 测试.rar\r\n";    //上传文件   

    send(listenFD,stor,sizeof(stor),0);

    recvbuff();

    //=======================================

        FILE *fp = NULL;                            //打开文件

        fp = fopen( "c:\\测试.rar","rb";          //只读打开二进制文件
      
      
    //============================================


    char filebuff[1024]  ; //发送文件缓冲

    long ret;      //实际发送的字节数
   

    printf("开始发送文件......";

    while(  fread(filebuff,1,1024,fp) )  //接收文件只到全部读完
    {
        slen = 1024;

        while( slen )                //不停发送,只到全部发送完成
        {
            ret = send(ssock,filebuff,1024,0);

            Sleep(0);           

            slen  -= ret;
        }

        ZeroMemory(filebuff,1024);
   
   
    }

      closesocket(ssock);


    printf("发送完成";

    return 0;


}

论坛徽章:
0
4 [报告]
发表于 2007-04-06 12:07 |只看该作者
别人的,没有实验,但是看着觉得对(有一个地方有问题,自己找)

论坛徽章:
0
5 [报告]
发表于 2007-04-06 12:11 |只看该作者
原帖由 heroooooo 于 2007-4-6 12:07 发表
别人的,没有实验,但是看着觉得对(有一个地方有问题,自己找)


谢谢了

论坛徽章:
0
6 [报告]
发表于 2007-04-06 12:12 |只看该作者
原帖由 net_robber 于 2007-4-6 12:02 发表
user 后免应该有 用户名吧??

有的,我是这样写的"USER name"

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2007-04-06 12:36 |只看该作者
原帖由 toiby 于 2007-4-6 12:12 发表

有的,我是这样写的"USER name"

别忘记了加\r\n

论坛徽章:
0
8 [报告]
发表于 2007-04-06 12:51 |只看该作者
原帖由 cjaizss 于 2007-4-6 12:36 发表

别忘记了加\r\n


恩,刚发现这个问题,谢谢提醒,终于登陆成功了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-04-06 12:52 |只看该作者
看 RFC

论坛徽章:
0
10 [报告]
发表于 2007-04-06 13:02 |只看该作者
原帖由 flw 于 2007-4-6 12:52 发表
看 RFC

里面好多东西啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP