免费注册 查看新帖 |

Chinaunix

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

[C++] 请大家帮忙看看我这个FTP程序为什么上传总是只能上传一部分 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-29 03:35 |只看该作者 |倒序浏览
大家好,我用SOCKET写了个FTP测试程序,下载没发现问题.但是上传文件的时候却只能上传第一次读取出的信息,以后的读取不能上传成功.但是当我用DBX 跟进去单步执行的时候,又没有问题.整个文件全部上传成功.
比较郁闷.请高手指点迷津, 程序的红色为上传部分,谢谢.
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <string>
#include <vector>
using namespace std;

#define   HOST   "192.168.175.232"
#define   USER_NAME   "administrator"
#define   PASSWORD   "smart"
#define   FTP_PORT 21

int main(int argc, char **argv)
{
    int  controlSock, listenSock,transferSock;
    struct sockaddr_in serverAddr, clientAddr;
    int ret;
    char recvBuf[4096], sendBuf[1024];
     memset(recvBuf, 0x00, sizeof(recvBuf));
      memset(sendBuf, 0x00, sizeof(recvBuf));
    if ((controlSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket");
        return false;
    }
    memset(&serverAddr, 0x00, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(HOST);
    serverAddr.sin_port = htons(21);
    if (connect(controlSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
    {
        perror("connect");
        return false;
    }
    printf("ftp %s\n",inet_ntoa(serverAddr.sin_addr));
    if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
    printf("%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
    if ((ret=send(controlSock, "USER administrator\r\n", strlen("USER administrator\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
     if ((ret=send(controlSock, "PASS smart\r\n", strlen("PASS smart\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
     if ((ret=send(controlSock, "CWD /cdrbk/200801/\r\n", strlen("CWD /cdrbk/200801/\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
   
     if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket");
        return false;
    }
    printf("listenSock construct!\n");
    memset(&clientAddr, 0x00, sizeof(clientAddr));
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
    clientAddr.sin_port = 0;
   
    if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
    {
        perror("bind");
        printf("binding failure!\n");
        return -1;
    }
    if (listen(listenSock, 3)<0)
    {
        perror("listen");
        return -2;
    }
    socklen_t sockLen=sizeof(clientAddr);
    getsockname(listenSock,   (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);
    printf("%d\n",ntohs(clientAddr.sin_port));
    sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
    sendBuf[strlen(sendBuf)] = '\0';
   
    if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
    {
        perror("send");
    }
    printf("send have finished!\n");
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("recv:%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
    if ((ret=send(controlSock, "REST 0\r\n", strlen("REST 0\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
    if ((ret=send(controlSock, "TYPE A\r\n", strlen("TYPE A\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s\n", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
    if ((ret=send(controlSock, "LIST\r\n", strlen("LIST\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("%s\n", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
    sockLen=sizeof(clientAddr);
    if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
    {
        perror("accept");
    }
    if ((ret = recv(transferSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
    printf("recv:%s\n", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
   if ( close(transferSock)) printf("the transferSock close error!\n");
   close(listenSock);
   
   
    //下载
    if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket");
        return false;
    }
    printf("listenSock construct!\n");
    memset(&clientAddr, 0x00, sizeof(clientAddr));
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
    clientAddr.sin_port = 0;
   
    if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
    {
        perror("bind");
        printf("binding failure!\n");
        return -1;
    }
    if (listen(listenSock, 3)<0)
    {
        perror("listen");
        return -2;
    }
     sockLen=sizeof(clientAddr);
    getsockname(listenSock,   (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);

    sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
    sendBuf[strlen(sendBuf)] = '\0';
    if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
    {
        perror("send");
    }
    printf("send have finished!\n");
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("recv:%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
     if ((ret=send(controlSock, "RETR patch\r\n", strlen("RETR patch\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
    printf("%s\n", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
   
    fd_set readfds;
    struct timeval tv;
    tv.tv_sec=0;
    tv.tv_usec=0;
    int fileSize=0;
    while (1)
    {
        memset(&readfds, 0x00, sizeof(readfds));
        FD_SET(listenSock, &readfds);
        if (!select(listenSock+1, &readfds, NULL, NULL, &tv))
                  continue;
        if (!FD_ISSET(listenSock, &readfds))
                  continue;
        if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
        {
            perror("accept");
        }
        memset(recvBuf, 0x00, sizeof(recvBuf));
        while (1)
        {
            memset(&readfds, 0x00, sizeof(readfds));
            FD_SET(transferSock, &readfds);
            if (!select(transferSock+1, &readfds, NULL, NULL, &tv))
                      continue;
            if (!FD_ISSET(transferSock, &readfds))
                      continue;
            if ((ret = recv(transferSock, recvBuf, 4095, 0)) < 0)
            {
                perror("recv");
                break;
            }
           // printf("%s\n",recvBuf);
            fileSize += ret;
            ret=0;
            if (fileSize < 33127)
            {
                continue;
            }
            else if (fileSize == 33127 )
            {
                break;
            }
            else
            {
               printf("file transfer error!!!\n");
               break;
            }
         }
    close(transferSock);
    break;
    }
    close(listenSock);
   
    //sleep(3);

    //上传  
  if ((listenSock=socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket");
        return false;
    }
    printf("listenSock construct!\n");
    memset(&clientAddr, 0x00, sizeof(clientAddr));
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_addr.s_addr = inet_addr("192.168.175.205");
    clientAddr.sin_port = 0;
   
    if (bind(listenSock, (struct sockaddr*)&clientAddr, sizeof(clientAddr))<0)
    {
        perror("bind");
        printf("binding failure!\n");
        return -1;
    }
    if (listen(listenSock, 3)<0)
    {
        perror("listen");
        return -2;
    }
     sockLen=sizeof(clientAddr);
    getsockname(listenSock,   (struct sockaddr*)&clientAddr, (socklen_t *)&sockLen);
    printf("begin send PORT!!!!\n");
    sprintf(sendBuf, "PORT 192,168,175,205,%d,%d\r\n", ntohs(clientAddr.sin_port)/256, ntohs(clientAddr.sin_port)%256);
    sendBuf[strlen(sendBuf)] = '\0';
    if ((ret=send(controlSock, sendBuf, strlen(sendBuf), 0))<0)
    {
        perror("send");
    }
    printf("send have finished!\n");
     memset(recvBuf, 0x00, sizeof(recvBuf));
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
     printf("recv:%s", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
     if ((ret=send(controlSock, "STOR /cdrbk/200801/test.txt\r\n", strlen("STOR /cdrbk/200801/test.txt\r\n"), 0))<0)
    {
        perror("send");
    }
     if ((ret = recv(controlSock, recvBuf, 4095, 0)) <0)
    {
        perror("recv");
        
    }
    printf("%s\n", recvBuf);
    memset(recvBuf, 0x00, sizeof(recvBuf));
    struct stat fileBuf;
    fd_set writefds;
    FILE *fp;
    if (stat("/home/ocs/srcbk/script/test2/test.txt", &fileBuf) < 0)
    {
        printf("stat get filestate error!\n");
        return -1;
    }
    fileSize= fileBuf.st_size;
    while (1)
    {
        memset(&writefds, 0x00, sizeof(writefds));
        memset(&readfds, 0x00, sizeof(readfds));
        FD_SET(listenSock, &readfds);
        if (!select(listenSock+1, &readfds, NULL, NULL, &tv))
                  continue;
        if (!FD_ISSET(listenSock, &readfds))
                  continue;
        if ((transferSock=accept(listenSock,(struct sockaddr*)&clientAddr,(socklen_t *)&sockLen )) < 0)
        {
            perror("accept");
        }
        memset(recvBuf, 0x00, sizeof(recvBuf));
        fp = fopen("/home/ocs/srcbk/script/test2/test.txt", "r");
        if (fp == NULL)
        {
            printf("/home/ocs/srcbk/script/test2/test.txt open failure!\n");
            return -1;
        }
        while (!feof(fp))
        {
            memset(&writefds, 0x00, sizeof(writefds));
            FD_SET(transferSock, &writefds);
            if (!select(transferSock+1, NULL, &writefds, NULL, &tv))
                      continue;
            if (!FD_ISSET(transferSock, &writefds))
                      continue;
            
            if ((ret =fread(recvBuf, 1,  4095, fp)) < 0)
            {
                printf("read file error!\n");
            }
            recvBuf[ret]='\0';
            fileSize -= ret;
            if ((ret = send(transferSock, recvBuf, 4095, 0)) < 0)
            {
                perror("recv");
                printf("send(transferSock, recvBuf, 4095, 0) function exit!!!!\n");
                break;
            }
            printf("%s\n",recvBuf);
            memset(recvBuf, 0x00, sizeof(recvBuf));
            if (fileSize > 0)
            {
                continue;
            }
            else if (fileSize == 0 )
            {
               printf("exit in normal access!!!\n");
                break;
            }
            else
            {
               printf("file transfer error!!!\n");
               break;
            }
         }
    close(transferSock);
    fclose(fp);
    break;
    }
   
close(listenSock);
   
    close(controlSock);
    return 0;
   
}

[ 本帖最后由 houhulou 于 2008-4-29 04:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-29 03:42 |只看该作者
如果运行的话,只有4095个字节写入服务器文件里,如果DBX跟进去单步执行,全部字节都可以写入文件里.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-04-29 11:19 |只看该作者
你太牛了!
如果是我的话,我就只会 system( "ftp -n ........" );
或者 use libcurl

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-04-29 11:21 |只看该作者
  1. 60 int ftpUpload( const char *ip, const char *userName, const char *passWord, const char *path, const char *localDir, const char *fileName )
  2. 61 {
  3. 62     FILE *fp;
  4. 63     char url[256];
  5. 64     CURL *curl;
  6. 65     CURLcode ret;
  7. 66     int retCode;
  8. 67     struct stat buf;
  9. 68     char fullName[256];
  10. 69
  11. 70     snprintf( fullName, sizeof(fullName), "%s/%s", localDir, fileName );
  12. 71
  13. 72     sprintf( url, "ftp://%s:%s@%s/%s/%s", userName, passWord, ip, path, fileName );
  14. 73
  15. 74     curl = curl_easy_init();
  16. 75     if ( curl == NULL ){
  17. 76         retCode = -1;
  18. 77         goto l1;
  19. 78     }
  20. 79
  21. 80     retCode = stat( fullName, &buf );
  22. 81     if ( retCode == -1 ){
  23. 82         retCode = -1;
  24. 83         goto l2;
  25. 84     }
  26. 85
  27. 86     fp = fopen( fullName, "r" );
  28. 87     if ( fp == NULL ){
  29. 88         retCode = -1;
  30. 89         goto l2;
  31. 90     }
  32. 91
  33. 92     curl_easy_setopt( curl, CURLOPT_UPLOAD, 1 );
  34. 93     curl_easy_setopt( curl, CURLOPT_URL, url );
  35. 94     curl_easy_setopt( curl, CURLOPT_READDATA, fp );
  36. 95     curl_easy_setopt(curl, CURLOPT_INFILESIZE, buf.st_size );
  37. 96 # ifdef __DEBUG__
  38. 97     curl_easy_setopt( curl, CURLOPT_VERBOSE, 1 );
  39. 98 # endif
  40. 99     ret = curl_easy_perform( curl );
  41. 100
  42. 101     fclose(fp);
  43. 102
  44. 103     if( ret != CURLE_OK ){
  45. 104         retCode = -1;
  46. 105         ERROR_LOG( "FTP 上传出错(%d):%s", ret, curl_easy_strerror(ret) );
  47. 106     }
  48. 107     else{
  49. 108         retCode = 0;
  50. 109     }
  51. 110
  52. 111 l2:
  53. 112     curl_easy_cleanup( curl );
  54. 113 l1:
  55. 114     return retCode;
  56. 115 }
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-04-29 13:18 |只看该作者
pass by.
first time to see libcul.he.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP