基于linux_C语言源码开发ftp客户端发送jpg图片到ftp服务器
状态轮询函数
- 这个函数会每毫秒轮询一次数组各值的状态
- 这样能确保ftp同时发送图片数量为MAX_FTP_UPLOAD_NUM(确保不会因同时发送太多张图片导致cpu使用率过高)
void ftp_CheckGroup()
{
int i = 0;
pthread_mutex_lock(&gFtpmutex);
for(i=0; i<MAX_FTP_UPLOAD_NUM;i++)
{
if(STATUS_WAIT == gftpfileinfo[i].uploadstatus)
{
if(0 == ftp_CreateUploadTask(&(gftpfileinfo[i])))
{
gftpfileinfo[i].uploadstatus = STATUS_UPLOADING;
}
else
{
printf("%s %d error! clear file[%s] from ftp group!\n", __FUNCTION__, __LINE__, gftpfileinfo[i].filename);
memset(&(gftpfileinfo[i]), 0, sizeof(stftpupload));
}
}
}
EXIT:
pthread_mutex_unlock(&gFtpmutex);
}
ftp上传数据线程
void* mrecord_ftp_uploadthread(void* param)
{
// pthreadinfo_add((char *)__func__);
char* tmp;
int sockfd;
int ret = 0;
char acFolder[32]={0};
char dstPath[32]={0};
char dstFile[32]={0};
stftpupload* pstftpupload = param;
if(0 == strlen(pstftpupload->filename))
{
printf("mrecord_ftp_uploadthread: illegal param.\n");
goto EXIT;
}
//抓拍类型文件夹
strcpy(acFolder, "Snap");
memcpy(dstPath,pstftpupload->filename,strlen(pstftpupload->filename));
memcpy(dstFile,pstftpupload->filename,strlen(pstftpupload->filename));
//找到文件名
printf("dst path: %s ,dst file: %s\n",dstPath,dstFile);
sockfd = ftp_connect("172.20.10.20", 21, "liu", "123");//ftp地址、端口号、账户名、密码
if(sockfd < 0)
{
printf("mrecord_ftp_uploadthread: ftp_connect return fail.\n");
goto EXIT;
}
ftp_mkd(sockfd,acFolder);//在ftp服务器创建文件夹
ftp_cwd(sockfd,acFolder);
ret = ftp_storfile(sockfd, pstftpupload->filename, dstFile, NULL, NULL);//开始发送文件数据
if(ret < 0)
{
printf("mrecord_ftp_uploadthread: ftp_storfile return fail.\n");
printf("delete file[%s], ret [%d]\n",dstFile, ftp_deletefile(sockfd, dstFile));
goto QUIT;
}
ftp_cdup(sockfd); //回到上一级目录
QUIT:
ret = ftp_quit(sockfd);
if(ret < 0)
{
printf("mrecord_ftp_uploadthread: ftp_quit return fail.\n");
}
EXIT:
ftp_SetCurFile(pstftpupload->filename, FTP_UPLOAD_FREE, 0);
return NULL;
}