当前位置: 技术问答>linux和unix
ftp停止服务后恢复,继续上传文件不成功的问题,十万火急,过年了!!!!!!
来源: 互联网 发布时间:2015-12-29
本文导语: 程序基本功能描述:在arm linux环境中,一个程序中有两个线程, 一个从usb摄像头不断地获取图片,压缩成jpg格式,以指定格式的 文件名存到指定位置,并把图片名称入队列; 另一个...
程序基本功能描述:在arm linux环境中,一个程序中有两个线程,
一个从usb摄像头不断地获取图片,压缩成jpg格式,以指定格式的
文件名存到指定位置,并把图片名称入队列;
另一个线程从队列中取文件名,上传图片到远程ftp服务器
问题描述: 因为是arm上的程序,所以必须保证在系统正常的情况下,这个程序也要正常运行,即:只要ftp服务开启,两个线程要正常,当ftp关闭,再恢复,程序必须正常
,但是我的程序实现不了,我的思路是,两个线程使用一个静态循环队列来实现同步,新图片的文件名入队,从队列取文件名,上传文件,然后删除文件,在上传线程中实现ftp的连接等准备工作,当上传图片失败后,重新连接ftp,尝试上传,失败,再尝试,同时删除图片(arm空间有限),循环...
哥们!我搞了两天了,没结果啊,经理天天催,过年了啊,哎!!! 请修改我的程序,或给我新的思路或更好的代码,谢谢!!!
代码如下:
//重要的结构和函数声明
struct myfile{
char file[50];
char filename[50];
FTPINFO ftpinfo;
};
struct queue{
struct myfile array_file[MAX];
int head,rear;
};
struct queue qu;
struct myfile struct_myfile;
struct myfile * f;
char imagefile[256];
char *ftpIP,*userName,*passWord;
void * uploadJpeg(struct queue *);
//主函数,不停地获取图片,并在里面创建上传线程
int main(int argc,char argv[]){
.....declare variables
.....init codes.....
.....
.....
upldJpeg=pthread_create(&uploadp,NULL,(void *)uploadJpeg,&qu);
//创建上传图片的线程,判断创建成功有否的代码就省了
while(max_try){ //max_try初始化为5,即尝试打开摄像头,5次失败的话退出
dev=open(device,O_RDWR);
if(dev==-1){
if(!--max_try){
fprintf(stderr,"can't open the device %s",device);
retrun 1;
}
}else
break;
}
while(1){ //不断地获取图片,并压缩,以当前时间精确到3位毫秒为文件名存到指定文件夹,同时文件名入队列
ftime(&tp); // struct timeb * tp
p=localtime(&tp.time); //struct tm * p
sprintf(struct_myfile.filename,"%s%04d%02d%02d%02d%02d%02d%03d.jpg",coorid,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,t->tm_sec,tp.millitm);
// coorid 是一个字符串常量,struct_myfile是一个结构提有file和filename是
//长度为256的数组两个成员,保证使用sprintf()堆栈不益处
sprintf(struct_myfile.file,"/picture/%s",struct_myfile.filename);
//图片路径为/picture/..jpg
if(*(struct_myfile.file)){ //如果文件创建成功,打开文件
out=fopen(struct_myfile.file,"wb");// FILE * out
if(!out){
perror(struct_myfile.file);
return 1;
}
}
fseek(out,0,SEEK_SET);
if(!num){ //int num=0; 该if块只执行一次
if(v41_set_input(dev,input,norm)==-1)
return 1;
if(v41_check_size(dev,&width,&height)==-1)
return 1;
}
if(format==FMT_YUV4MPEG){ //FMT_YUV4MPEG 是一个常量
if(palette==VIDEO_PALETTE_YUV420P)
retrun to_yuv(out,dev,width,height);//函数to_yuv 的功能我也不明白,
//有个注释:write YUV4MPEG stream which is nice for mpeg2enc
break;
}
image=get_image(dev,width,height,paleete,&size);//获取图片,由char * image 指向
if(image){ //获取成功,写入out 指向的打开文件
put_image_jpeg(out,image,width,height,quality,palette);
if(size)
munmap(image,size);//释放image指向的内存
else if(image)
free(image);
}
if(!out)
fclose(out);
if(!in_queue(&qu,f))
printf("can't enter the queue!n");
}
return 0;
}
//上传函数代码马上发出
一个从usb摄像头不断地获取图片,压缩成jpg格式,以指定格式的
文件名存到指定位置,并把图片名称入队列;
另一个线程从队列中取文件名,上传图片到远程ftp服务器
问题描述: 因为是arm上的程序,所以必须保证在系统正常的情况下,这个程序也要正常运行,即:只要ftp服务开启,两个线程要正常,当ftp关闭,再恢复,程序必须正常
,但是我的程序实现不了,我的思路是,两个线程使用一个静态循环队列来实现同步,新图片的文件名入队,从队列取文件名,上传文件,然后删除文件,在上传线程中实现ftp的连接等准备工作,当上传图片失败后,重新连接ftp,尝试上传,失败,再尝试,同时删除图片(arm空间有限),循环...
哥们!我搞了两天了,没结果啊,经理天天催,过年了啊,哎!!! 请修改我的程序,或给我新的思路或更好的代码,谢谢!!!
代码如下:
//重要的结构和函数声明
struct myfile{
char file[50];
char filename[50];
FTPINFO ftpinfo;
};
struct queue{
struct myfile array_file[MAX];
int head,rear;
};
struct queue qu;
struct myfile struct_myfile;
struct myfile * f;
char imagefile[256];
char *ftpIP,*userName,*passWord;
void * uploadJpeg(struct queue *);
//主函数,不停地获取图片,并在里面创建上传线程
int main(int argc,char argv[]){
.....declare variables
.....init codes.....
.....
.....
upldJpeg=pthread_create(&uploadp,NULL,(void *)uploadJpeg,&qu);
//创建上传图片的线程,判断创建成功有否的代码就省了
while(max_try){ //max_try初始化为5,即尝试打开摄像头,5次失败的话退出
dev=open(device,O_RDWR);
if(dev==-1){
if(!--max_try){
fprintf(stderr,"can't open the device %s",device);
retrun 1;
}
}else
break;
}
while(1){ //不断地获取图片,并压缩,以当前时间精确到3位毫秒为文件名存到指定文件夹,同时文件名入队列
ftime(&tp); // struct timeb * tp
p=localtime(&tp.time); //struct tm * p
sprintf(struct_myfile.filename,"%s%04d%02d%02d%02d%02d%02d%03d.jpg",coorid,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,t->tm_sec,tp.millitm);
// coorid 是一个字符串常量,struct_myfile是一个结构提有file和filename是
//长度为256的数组两个成员,保证使用sprintf()堆栈不益处
sprintf(struct_myfile.file,"/picture/%s",struct_myfile.filename);
//图片路径为/picture/..jpg
if(*(struct_myfile.file)){ //如果文件创建成功,打开文件
out=fopen(struct_myfile.file,"wb");// FILE * out
if(!out){
perror(struct_myfile.file);
return 1;
}
}
fseek(out,0,SEEK_SET);
if(!num){ //int num=0; 该if块只执行一次
if(v41_set_input(dev,input,norm)==-1)
return 1;
if(v41_check_size(dev,&width,&height)==-1)
return 1;
}
if(format==FMT_YUV4MPEG){ //FMT_YUV4MPEG 是一个常量
if(palette==VIDEO_PALETTE_YUV420P)
retrun to_yuv(out,dev,width,height);//函数to_yuv 的功能我也不明白,
//有个注释:write YUV4MPEG stream which is nice for mpeg2enc
break;
}
image=get_image(dev,width,height,paleete,&size);//获取图片,由char * image 指向
if(image){ //获取成功,写入out 指向的打开文件
put_image_jpeg(out,image,width,height,quality,palette);
if(size)
munmap(image,size);//释放image指向的内存
else if(image)
free(image);
}
if(!out)
fclose(out);
if(!in_queue(&qu,f))
printf("can't enter the queue!n");
}
return 0;
}
//上传函数代码马上发出
|
哎,看完了,这么长的程序
提点建议吧;当上传不了图片时,你使用pthread_exit()自己结束线程,然后发送一个消息(或修改一个标志),使用另外一个程序用脚本重新启动就是了
提点建议吧;当上传不了图片时,你使用pthread_exit()自己结束线程,然后发送一个消息(或修改一个标志),使用另外一个程序用脚本重新启动就是了
|
> 我现在的程序,就是ftp断了之后,在尝试连接上传不行
为什么不行? 报什么错?
为什么不行? 报什么错?