📄 rosftplib.c
字号:
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 + -