免费注册 查看新帖 |

Chinaunix

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

高手帮忙,ftp编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-27 10:15 |只看该作者 |倒序浏览
在网上搜索了一些ftp客户端程序,然后自己做了些改动,编译通过,但是执行有问题,请高手帮忙调试,谢谢!
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define FTP_PORT    21
#define MAXBACKLOG  30


void die(char *mess)
{
        perror(mess);
        exit(1);
}

static int saferecv(int fd, char *buf, int size)
{
        int ret;        
        if ((ret = recv(fd, buf, size, 0)) < 0)
                {
                die("recv error";
        }
        return ret;
}



static int safesend(int fd, char *buf, int size)
{
        int ret;      
        if ((ret = send(fd, buf, size, 0)) < 0)
                {
                die("send error";            
        }
        return ret;
}



static int connect_ftp(char *ip, char *username, char *password)
{
        int          sockfd, port;
        struct sockaddr_in server;
        char         buff[1024];

        port = FTP_PORT;

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                {
                die("socket failed";
        }
        server.sin_family = AF_INET;
        server.sin_port = htons((unsigned short)port);
        server.sin_addr.s_addr = inet_addr(ip);

        if (connect(sockfd, (struct sockaddr *)&server , sizeof(server)) < 0)
        {
               die("connect failed";
        }

        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        if (strstr(buff, "220" == NULL)
                {
                die("connection refused by remote ftp server\n";
                close(sockfd);
        }

        memset(buff, 0, sizeof(buff));
        sprintf(buff, "USER %s\r\n", username);
        if (safesend(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0) {
                close(sockfd);
                return -1;
        }
        if (strstr(buff, "331" == NULL)
                {
                die("ERROR:connection refused by remote ftp server\n";
                close(sockfd);
                return -1;
        }

        memset(buff, 0, sizeof(buff));
        sprintf(buff, "ASS %s\r\n", password);
        if (safesend(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
       
        if (strstr(buff, "230" == NULL)
                {
               
                                die("ERROR:username and password not match\n";
                close(sockfd);
                return -1;
        }

        memset(buff, 0, sizeof(buff));
        sprintf(buff, "SYST\r\n");
        if (safesend(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        sprintf(buff, "TYPE I\r\n");
        if (safesend(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        return sockfd;
}

static int create_dataconn(int sockfd, char *localip, int localport)
{
        int          on = 1, l_i;
        int          localsock;
        struct       sockaddr_in localserver;


        if((localsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                {
                die("socket() failed");
                close(sockfd);
                return -1;
        }
        if (setsockopt(localsock, SOL_SOCKET, SO_REUSEADDR,
                (char *)&on, sizeof(on)) < 0)
                {
                die("setsockopt() failed");
                close(sockfd);
                close(localsock);
                return -1;
        }

        localserver.sin_family = AF_INET;
        localserver.sin_addr.s_addr = INADDR_ANY;
        localserver.sin_port = htons((unsigned short)localport);

        if ((bind(localsock, (struct sockaddr *)&localserver, sizeof(localserver)) < 0))
                {
                /*put_log("ERROR:%s\n", strerror(errno)); */
                die("bind failed");
                close(sockfd);
                close(localsock);
                return -1;
        }

                if (listen(localsock, MAXBACKLOG) < 0)
                {
                die("listen failed");
                close(sockfd);
                close(localsock);
                return -1;
        }
        /*if (get_localip(localip) == -1)
                {
                put_log("ERROR:get_localip\n");
                close(sockfd);
                close(localsock);
                return -1;
        }
        for (l_i = 0; l_i < strlen (localip); l_i++)
                if (localip[l_i] == '.')
                        localip[l_i] = ',';*/

        return localsock;
}


int upload(char *ftpserver, char *username, char *password, char *filename)
{
        int          sockfd, localsock, dsock;
        int          localport;
        int          fd;
        struct sockaddr_in remote;
        int                remote_len;
        char         buff[1024];
        char         localip[256] = "192.24.88.4";
        int dwRead;
        int dw;

        if ((sockfd = connect_ftp(ftpserver, username, password)) < 0)
                {
                die("ERROR:connect_ftp\n");
                return -1;
        }

        /*use random number as port for ftpdata bind*/
        localport = (rand () % 20000) + 2000;

        if ((localsock = create_dataconn(sockfd, localip, localport)) < 0)
                {
                die("ERROR:data_ftp\n");
                return -1;
        }

        memset(buff, 0, sizeof(buff));
        sprintf(buff, "ORT %s,%d,%d\r\n", localip, localport / 256, localport % 256);
        if (safesend(sockfd, buff, sizeof(buff)) < 0)
        {
                close(sockfd);
                close(localsock);
                return -1;
        }
        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                return -1;
        }
        if (strstr(buff, "200") == NULL)
                {
                die("Unable to get valid data\n");
                close(sockfd);
                close(localsock);
                return -1;
        }

        memset(buff, 0, sizeof(buff));
        sprintf (buff, "STOR %s\r\n", filename);
        if (safesend (sockfd, buff, sizeof(buff)) < 0)
        {
                close (sockfd);
                close (localsock);
                return -1;
        }

        memset(buff, 0, sizeof(buff));
        if (saferecv(sockfd, buff, sizeof(buff)) < 0)
                {
                close(sockfd);
                close(localsock);
                return -1;
        }
        if (strstr(buff, "150") == NULL)
                {
                die("ERROR:Unable to get valid data\n");
                close(sockfd);
                close(localsock);
                return -1;
        }
        if ((dsock = accept (localsock, (struct sockaddr *) &remote, &remote_len)) < 0)
                {
                die("ERROR:accept");
                close(sockfd);
                close(localsock);
                return -1;
        }
        close(localsock);

        if ((fd = open(filename, O_RDONLY)) < 0)
                {
                die("ERRORpen");
                close (sockfd);
                close (dsock);
                return -1;
        }
        dwRead = 0;
        dw = 0;
        while (1)
        {
                memset(buff, 0, sizeof(buff));
                dwRead = read(fd, buff, sizeof(buff));
                if (dwRead <= 0) {
                        break;
                }
                dw = safesend(dsock, buff, dwRead);
                if (dw < 0)
                {
                        close (sockfd);
                        close (dsock);
                        return -1;
                }
                if (dwRead != sizeof(buff))
                                {
                        break;
                }
        }
        close(fd);
        close(dsock);

        memset(buff, 0, sizeof(buff));
        saferecv(sockfd, buff, sizeof(buff));
        while (strstr (buff, "226") == NULL)
        {
                memset(buff, 0, sizeof(buff));
                saferecv(sockfd, buff, sizeof(buff));
        }
        sprintf(buff, "QUIT\r\n");
        safesend(sockfd, buff, sizeof(buff));
        saferecv(sockfd, buff, sizeof(buff));
        close(sockfd);

        return 0;
}


int main(int argc, char *argv[])
{
   char *ftpserver="192.24.1.13";
   char *username="tmp";
   char *password="tmp";
   char *filename="ftpd.c";
   upload(ftpserver, username, password, filename);
}

论坛徽章:
0
2 [报告]
发表于 2007-03-27 10:58 |只看该作者
这个貌似研究的人不是很多

论坛徽章:
0
3 [报告]
发表于 2007-03-27 11:05 |只看该作者
请各位高手帮帮忙啊,老板给的任务阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP