分类: LINUX
2008-08-20 18:22:52
/******************************************************* *Filename:soket_image.c *Description:Sendimagebygprs *Author:ly44770 *History:1.0 *Date:07/06/27 *******************************************************/ #include #include #include #include #include //#include #include #include #include #include #include #include #include //#include #include #include #include #include #defineTRUE1 #defineFALSE0 #defineSERVPORT9009 #defineSERVER_IP"192.168.1.202" //#defineSERVER_IP"192.168.0.21" typedefcharBOOL; BOOLbDataOK; #defineSIZE_PACKET512 #defineSTR_HEAD"MY_IMG" #defineGH_DBNAME"MY_IMG_ARM" #defineGroup_Devide_Flag"|" #defineSTR_TAIL"AT91RM" #defineNAME_LENstrlen(GH_DBNAME) typedefstruct { unsignedshortID;//CommandID charParameter1;//Parameter1 charParameter2;//Parameter2 charParameter3;//Parameter3 charParameter4;//Parameter4 }_comedia_CMD; //_comedia_CMDcomedia_CMD; _comedia_CMDcomedia_CMD2; typedefstruct { unsignedshortID; unsignedshortDataSize; chardata[506]; unsignedshortVerifyCode; }_PKG; _PKGPKG; _PKGPKG2; #pragmapack(1) typedefstruct { charBufHead[6]; charBufDevide1[1]; charBufDbName[NAME_LEN]; charBufDevide2[1]; _PKGm_Pkg; charBufDevide3[1]; charBufTail[4]; }GH_PKG; #pragmapack() GH_PKGSendPkg; //unsignedlongulImageBuffer; //unsignedlongulIndex; voidInitPackage() { memset(SendPkg.BufHead,''\0'',6); memcpy(SendPkg.BufHead,STR_HEAD,strlen(STR_HEAD)); memset(SendPkg.BufDevide1,''\0'',1); memcpy(SendPkg.BufDevide1,Group_Devide_Flag,strlen(Group_Devide_Flag)); memset(SendPkg.BufDbName,''\0'',11); memcpy(SendPkg.BufDbName,GH_DBNAME,strlen(GH_DBNAME)); memset(SendPkg.BufDevide2,''\0'',1); memcpy(SendPkg.BufDevide2,Group_Devide_Flag,strlen(Group_Devide_Flag)); memcpy(&SendPkg.m_Pkg,&PKG2,sizeof(_PKG)); memset(SendPkg.BufDevide3,''\0'',1); memcpy(SendPkg.BufDevide3,Group_Devide_Flag,strlen(Group_Devide_Flag)); memset(SendPkg.BufTail,''\0'',4); memcpy(SendPkg.BufTail,STR_TAIL,strlen(STR_TAIL)); } pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER; sem_tget_img,send_img; voidconsumer(void*arg); voidproductor(void*arg); intmain(intargc,char*argv[]) { intret; pthread_tid1,id2; pthread_mutex_init(&mutex,NULL); if(ret!=0) { perror("mutex_init"); } ret=sem_init(&get_img,0,0); if(ret!=0) { perror("get_img_sem_init"); } ret=sem_init(&send_img,0,1); if(ret!=0) { perror("send_img_sem_init"); } //InitPackage(); while(1){ ret=pthread_create(&id1,NULL,(void*)productor,NULL); if(ret!=0) perror("pthreadcread1"); ret=pthread_create(&id2,NULL,(void*)consumer,NULL); if(ret!=0) perror("pthreadcread2"); pthread_join(id1,NULL); pthread_join(id2,NULL); } exit(0); } voidproductor(void*arg) { //inti,nwrite; while(1) { sem_wait(&send_img); if(pthread_mutex_lock(&mutex)!=0){ perror("pthread_mutex_lock"); exit(1); } printf("getimagepthreadstart\n"); if(fork()==0) { if(execl("/home/a/vgrabbj","vgrabbj","-f./1.jpg","-d/dev/v4l/video0",NULL)<0) perror("execlerror!\n"); printf("getimageok"); } wait(0); if(pthread_mutex_unlock(&mutex)!=0){ perror("pthread_mutex_unlock"); } else printf("getimagepthreadstop\n"); sem_post(&get_img); sleep(1); //pthread_exit(0); } } voidconsumer(void*arg) { inti,img_fd; intsockfd,sendbytes; structsockaddr_inserv_addr; void*img_addr=NULL; intimg_index; void*img_addr2=NULL; intimg_index2; structstatsb; intPkg_num,DataSize,LastDataSize; BOOLbDone; intiIndex,iTemp; //bDone=FALSE; //iIndex=0; while(1) { sem_wait(&get_img); if(pthread_mutex_lock(&mutex)!=0){ perror("pthread_mutex_lock"); } else { printf("sendimagepthreadstart\n"); img_fd=open("/home/work/mywork/image/1.jpg",O_RDONLY); if(img_fd<0) {perror("opentheimage"); exit(1); } fstat(img_fd,&sb); img_addr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,img_fd,0); if(img_addr==MAP_FAILED) {perror("maptheimage"); exit(1); } LastDataSize=sb.st_sizeP6; if(LastDataSize==0) Pkg_num=sb.st_size/506; else Pkg_num=sb.st_size/506 1; //LastDataSize=sb.st_sizeP6; DataSize=Pkg_num*512; //DataSize=sb.st_size; img_addr2=malloc(DataSize); if(img_addr2==NULL) printf("mallocerror\n"); img_index=0; img_index2=0; if(LastDataSize==0) {for(i=0;i =6) { iIndex=0; if(comedia_CMD2.ID==0x0eaa) { if(comedia_CMD2.Parameter3==(char)0xf0 &&comedia_CMD2.Parameter4==(char)0xf0) { //bDataOK=FALSE; printf("\nsendImageid=%d.\n",PKG2.ID); bDone=TRUE; } else { if(TRUE) { printf("\nsendImageid=%d.\n",comedia_CMD2.Parameter3); memcpy(&PKG2,img_addr2 comedia_CMD2.Parameter3*512,sizeof(_PKG)); memcpy(&SendPkg.m_Pkg,&PKG2,sizeof(_PKG)); printf("\nGH_PKGsize=%d\n",sizeof(GH_PKG)); printf("\n_PKGsize=%d\n",sizeof(_PKG)); if((iTemp=send(sockfd,&SendPkg,sizeof(GH_PKG),0))==-1){ printf("\ntcpwriteerror!\n"); perror("send"); exit(1); } } } } } } close(sockfd); free(img_addr2); img_addr2=NULL; if(pthread_mutex_unlock(&mutex)!=0){ perror("pthread_mutex_unlock"); } else printf("sendimagepthreadstop\n"); sem_post(&send_img); sleep(1); //pthread_exit(0); } } }