⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rosftplib.c

📁 vxworks MPC8541 BSP
💻 C
📖 第 1 页 / 共 3 页
字号:
        close(pn->sockFd);

    pn->state = Listening;
    pn->sockFd = sockFd;

    return OK;
}

/*----------------------------------------------------------------------
 * NAME:        ftpClntSendCommand
 * PARAMETERS:
 * RETURN:      OK/ERROR
 * FUNCTION:    send control command string through control socket.
 */
LOCAL STATUS ftpClntSendCommand(FTP_CLIENT_NODE *pClnt,char* pBuf)
{
    char    *pStr = pBuf;
    int     result;
    UINT32  startTick;
    int     sndLen = strlen(pBuf);

    if (pClnt->ctrlNode.sockFd == INVALID_SOCK)
        return ERROR;

    strncpy(pClnt->cmdBuf,pBuf,sizeof(pClnt->cmdBuf));

    startTick = tickGet();
    while(1)
    {
        if( (tickGet()-startTick) > sysClkRateGet()*FTP_SEND_TIMEO)
            return ERROR;

        result = send(pClnt->ctrlNode.sockFd,pStr,sndLen,0);
        if (result == sndLen)
            return OK;

        if ( result == ERROR )
        {
            if ( errnoGet() == EWOULDBLOCK )
            {
                taskDelay(1);
                continue;
            }
            else
            {
                pClnt->ctrlNode.state = Error;
                return ERROR;
            }
        }

        sndLen -= result;
        pStr   += result;
    }

    /*return OK;*/
}


/*----------------------------------------------------------------------
 * NAME:        ftpClntDownload
 * PARAMETERS:
 * RETURN:      OK/ERROR
 * FUNCTION:    FTP client download the file.
 */
LOCAL STATUS ftpClntDownload(FTP_CLIENT_NODE* pClnt)
{
    struct sockaddr_in  inetAddr;
    struct timeval      timeo;
    struct fd_set       readFds,exceptFds,writeFds;
    STATUS              result = OK;
    int                 nCnt,sockFd;
    UINT32               lastEventTick;

    bzero ((char *) &inetAddr, sizeof(inetAddr));
    inetAddr.sin_family     = AF_INET;
    inetAddr.sin_len        = (UINT8) sizeof(inetAddr);
    inetAddr.sin_port       = htons (FTP_SERVER_PORT);
    inetAddr.sin_addr.s_addr= pClnt->server;

    if (( sockFd = socket( AF_INET,SOCK_STREAM,0))== ERROR)
        return ERROR;

    timeo.tv_sec  = FTP_CONNECT_TIMEO;
    timeo.tv_usec = 0;

    nCnt = 0;
    while(nCnt++ < 3)
    {
        if((result=connectWithTimeout(sockFd,(struct sockaddr*)&inetAddr,sizeof(inetAddr),&timeo)) == OK )
            break;
    }

    if (result != OK)
    {   close(sockFd); return ERROR; }

    /* connect to server successfully */
    if ( ftpClntSocketConfig(sockFd) == ERROR )
    { close(sockFd); return ERROR;  }

    pClnt->ctrlNode.state  = Active;
    pClnt->ctrlNode.sockFd = sockFd;

    timeo.tv_sec  = 5;
    timeo.tv_usec = 0;

    lastEventTick = tickGet();
    while(TRUE)
    {
        FD_ZERO(&readFds);
        FD_ZERO(&writeFds);
        FD_ZERO(&exceptFds);
        if(pClnt->ctrlNode.sockFd != INVALID_SOCK)
        {
            FD_SET(pClnt->ctrlNode.sockFd,&readFds);
            FD_SET(pClnt->ctrlNode.sockFd,&exceptFds);
        }
        if(pClnt->dataNode.sockFd != INVALID_SOCK)
        {
            FD_SET(pClnt->dataNode.sockFd,&readFds);
            FD_SET(pClnt->dataNode.sockFd,&exceptFds);
        }

        if (select(FD_SETSIZE,&readFds,&writeFds,&exceptFds,&timeo) !=0 )
        {
            lastEventTick = tickGet();
            if ((result = ftpClntEventHandler(pClnt,&readFds,&exceptFds))==ERROR)
                break;

        }
        else  /* timeout */
        {
            if( (tickGet()-lastEventTick) > sysClkRateGet() * 10 )
            {
                FTP_ERR_MSG("download timeout.\n",1,2,3,4);
                result = ERROR;
                break;
            }
        }

        if (    pClnt->dataNode.state == End
             && ( pClnt->reply == 226 || pClnt->reply == 250 || pClnt->reply == 111) )
            break;

    }  /* end while(TRUE) */

    return (result);
}

/*----------------------------------------------------------------------
 * NAME:        FtpGetFile
 * PARAMETERS:
 * RETURN:      bytes/ERROR
 * FUNCTION:    user ftp client interface.
 */
int FtpGetFile(     char *server,
                    char *user,
                    char *psw,
                    char *sfile,
                    void *location,
                    int  size,
                    UINT8 mode)
{
    FTP_CLIENT_NODE     clntNode;
    int                 result;
   	char                ProcMsg[256]; /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/

    tcp_keepintvl = 1;
    tcp_keepcnt   = 5;
    tcp_keepidle  = 10;
    tcp_maxidle   = 10;

    ftpClntNodeInit(&clntNode);
    strncpy(clntNode.user,user,sizeof(clntNode.user));
    strncpy(clntNode.password,psw,sizeof(clntNode.password));
    strncpy(clntNode.sfile,sfile,sizeof(clntNode.sfile));
    clntNode.memSize = size; /* 1G bytes */
    clntNode.mode = mode;

    clntNode.server = inet_addr(server);

    clntNode.dMem = location;
    clntNode.pRcvBuf = malloc(TCP_RCV_SIZE_DFLT);

    /* for deflated-version; initialize z_stream */

    if ( inflateInit(&(clntNode.z_stream)) != Z_OK)
    {
        inflateEnd(&(clntNode.z_stream));
        ftpClntClose(&clntNode);
        return ERROR;
    }
    clntNode.z_checksum = 0;
    clntNode.z_state = Z_OK;
    clntNode.z_stream.next_in    = NULL;
    clntNode.z_stream.avail_in   = 0;
    clntNode.z_stream.next_out   = clntNode.z_outbuf;
    clntNode.z_stream.avail_out  = OUTBUF_SIZE;
    clntNode.z_stream.total_in   = 0;

    /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
	sprintf(ProcMsg,"FTP getting file %s",sfile);
	/*ProcMsgPrint(ProcMsg,PROCESSING);*/
    /*end of yuqiang added*/

    result = ftpClntDownload(&clntNode);

    inflateEnd(&(clntNode.z_stream));
    ftpClntClose(&clntNode);

    if (result == OK)
	{
        /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
    	sprintf(ProcMsg,"FTP getting file %s[%u]",sfile,clntNode.totalRcv);
    	/*ProcMsgPrint(ProcMsg,PROC_OK); */
		/*printf(" get file %s[%u] successfully!\n",sfile,clntNode.totalRcv);*/
	}
    else
	{
        /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
    	sprintf(ProcMsg,"FTP getting file %s",sfile);
    	/*ProcMsgPrint(ProcMsg,PROC_ERROR); */
		/*printf(" sorry,get file %s failed!\n",sfile);*/
	}

    return (result==OK?clntNode.totalRcv:ERROR);
}


/*----------------------------------------------------------------------
 * NAME:        FtpCopyFile
 * PARAMETERS:
 * RETURN:      bytes/ERROR
 * FUNCTION:    user ftp interface for copying file.
 */
int FtpCopyFile(    char* server,
                    char *user,
                    char *psw,
                    char *sfile,
                    char* dfile,
                    UINT8 mode)
{
    FTP_CLIENT_NODE     clntNode;
    int                 result;
    char                ProcMsg[256]; /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/

    ftpClntNodeInit(&clntNode);
    strncpy(clntNode.user,user,sizeof(clntNode.user));
    strncpy(clntNode.password,psw,sizeof(clntNode.password));
    strncpy(clntNode.sfile,sfile,sizeof(clntNode.sfile));
    strncpy(clntNode.dfile,dfile,sizeof(clntNode.dfile));
    clntNode.mode = mode;
    clntNode.memSize = 0x40000000; /* 1G bytes */

    clntNode.server = inet_addr(server);

    /* open file */
    if (    (clntNode.dfp = fopen(dfile,"wb")) == NULL
        ||  (clntNode.pRcvBuf = malloc(TCP_RCV_SIZE_DFLT)) == NULL )
    {
        ftpClntClose(&clntNode);
        return ERROR;
    }

    /* for deflated-version; initialize z_stream */

    if ( inflateInit(&(clntNode.z_stream)) != Z_OK)
    {
        inflateEnd(&(clntNode.z_stream));
        ftpClntClose(&clntNode);
        return ERROR;
    }
    clntNode.z_checksum = 0;
    clntNode.z_state = Z_OK;
    clntNode.z_stream.next_in    = NULL;
    clntNode.z_stream.avail_in   = 0;
    clntNode.z_stream.next_out   = clntNode.z_outbuf;
    clntNode.z_stream.avail_out  = OUTBUF_SIZE;
    clntNode.z_stream.total_in   = 0;

    /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
    sprintf(ProcMsg,"FTP copying file %s",sfile);
    /*ProcMsgPrint(ProcMsg,PROCESSING);*/
    /*end of yuqiang added*/

    result = ftpClntDownload(&clntNode);

    inflateEnd(&(clntNode.z_stream));
    ftpClntClose(&clntNode);

    if (result == OK)
	{
        /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
    	sprintf(ProcMsg,"FTP copying file %s[%u]",sfile,clntNode.totalRcv);
    	/*ProcMsgPrint(ProcMsg,PROC_OK); */
		/*printf(" get file %s[%u] successfully!\n",sfile,clntNode.totalRcv);*/
	}
    else
	{
        /*yuqiang changed on 2003-2-17:统一各产品启动打印信息*/
    	sprintf(ProcMsg,"FTP copying file %s",sfile);
    	/*ProcMsgPrint(ProcMsg,PROC_ERROR); */
		/*printf(" sorry,get file %s failed!\n",sfile);*/
	}

    return (result==OK?clntNode.totalRcv:ERROR);
}


/*----------------------------------------------------------------------
 * NAME:        FtpGetFileLength
 * PARAMETERS:
 * RETURN:      bytes/ERROR
 * FUNCTION:    user ftp client interface.
 */
int FtpGetFileLength( char *server,
                      char *user,
                      char *psw,
                      char *sfile,
                      UINT8 mode)
{
    FTP_CLIENT_NODE     clntNode;
    int                 result;

    tcp_keepintvl = 1;
    tcp_keepcnt   = 5;
    tcp_keepidle  = 10;
    tcp_maxidle   = 10;

    fileLength    = 0;
    getFileLength = 1;

    ftpClntNodeInit(&clntNode);
    strncpy(clntNode.user,user,sizeof(clntNode.user));
    strncpy(clntNode.password,psw,sizeof(clntNode.password));
    strncpy(clntNode.sfile,sfile,sizeof(clntNode.sfile));
    clntNode.mode = mode;
	clntNode.dataNode.state  = End;

    clntNode.server = inet_addr(server);

    result = ftpClntDownload(&clntNode);

    ftpClntClose(&clntNode);

    getFileLength = 0;

    if (result == OK)
    {
        printf(" get file %s length successfully!\n",sfile);
        return fileLength;
    }
    else
    {
        printf(" sorry,get file %s length failed!\n",sfile);
    	return result;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -