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

📄 main.cpp

📁 使用于2410终端上的一个播放类似ppt文件的程序,涉及Tcp/IP通信、局域网广播、Qt视窗系统、pThread等多个方面。修改makefile中编译工具即可编译
💻 CPP
📖 第 1 页 / 共 3 页
字号:
								picctrl.blplaying=true;								picctrl.blpausing=false;								mainwindow->repaint();								sem_post(&gsem);								break;							}						case PICPAUSEPLAY:							{								printf("paused\n");								sem_wait(&gsem);								picctrl.blpausing=true;								picctrl.blplaying=true;								mainwindow->repaint();								sem_post(&gsem);								break;							}						case PICSTOPPLAY:							{								sem_wait(&gsem);								printf("stop\n");								picctrl.blplaying=false;								picctrl.blpausing=false;								picctrl.threadid=0;								sem_post(&gsem);								mainwindow->ResetPaint();								pthread_exit(NULL);								break;							}						case PICNEXT:							{								goto _playnext;							}						case PICPREVIOUS:							{								if(historyindex>=0)								{									sem_wait(&gsem);									picctrl.inumber=historyarr[historyindex];									sem_post(&gsem);								}								historyindex--;								goto _autoplay;							}					}				}					usleep(10000);//100 ms			}_playnext:						if(historyindex<90) 			historyarr[++historyindex]=picctrl.inumber;					sem_wait(&gsem);			if(pbody->iNextPic==-1)				picctrl.inumber++;			else picctrl.inumber=pbody->iNextPic;			if(picctrl.inumber>picctrl.ipiccount)				picctrl.inumber=0;				sem_post(&gsem);			goto _autoplay;			}		case 1://hand		{_handplay:			memset(chbmpname,0,20);			pbody=ppicbodyarr[picctrl.inumber];				//printf("***************************************************************\n");			sprintf(chbmpname,"%d.bmp",picctrl.inumber);			//printf("current bmp :%s\n",chbmpname);			mainwindow->ShowPic(chbmpname,pbody->iMoveinType);			printf("read cmd from pipe............\n");			retid=msgrcv(msglistid,&msg,50,0,0);				chcmd=msg.msgtype;			printf("recv ret:%d\n",retid);			if(retid==0)			{				printf("recv cmd:%d\n",chcmd);				switch(chcmd)				{					case PICSTOPPLAY:						{							sem_wait(&gsem);							printf("stop\n");							picctrl.blplaying=false;							picctrl.blpausing=false;							picctrl.threadid=0;							sem_post(&gsem);							mainwindow->ResetPaint();							pthread_exit(NULL);							break;						}					case PICNEXT:						{							printf("picnext\n");							sem_wait(&gsem);							historyarr[++historyindex]=picctrl.inumber;									if(pbody->iNextPic==-1)							picctrl.inumber++;							else picctrl.inumber=pbody->iNextPic;							if(picctrl.inumber>picctrl.ipiccount)							picctrl.inumber=0;								sem_post(&gsem);							break;						}					case PICPREVIOUS:						{							printf("picprevious\n");							if(historyindex>=0)							{								sem_wait(&gsem);								picctrl.inumber=historyarr[historyindex];								sem_post(&gsem);							}							historyindex--;							break;						}				}//switch			}				goto _handplay;		}	}	_error:	picctrl.blplaying=false;	picctrl.blpausing=false;	picctrl.threadid=0;	mainwindow->repaint();	return NULL;}void * BeginServer(void* pparam){	int sock=socket(AF_INET,SOCK_STREAM,0);	if(sock==-1)	{		printf("create sock error\n");		return NULL;	}	struct sockaddr_in addr;	memset(&addr,0,sizeof(struct sockaddr_in));	addr.sin_addr.s_addr = INADDR_ANY;	addr.sin_family=AF_INET;	addr.sin_port=htons(7069);	if(bind(sock,(struct sockaddr*)&addr,sizeof(struct sockaddr))==-1)	{		printf("bind error\n");		return NULL;	}	if(listen(sock,10)==-1)	{		printf("listen error\n");		return NULL;	}	int clientsock;	printf("beign listen socket\n");	for(;;)	{		if(clientsock=accept(sock,NULL,0))		{			printf("accept client:%d\n",clientsock);			//mainwindow->showpic("/usr/bin/1.bmp");			pthread_t clientthread;			printf("Lock online state\n");			sem_wait(&gsemonline);			printf("locked\n");			pthread_create(&clientthread,NULL,&ClientServerThread,&clientsock);			onlineusrcount++;			printf("waiting unlocking\n");			sem_post(&gsemonline);			printf("unlocked\n");			sleep(1);		}	}	close(sock);	return NULL;}void ClearPipeBuff(){	message msg;	while(msgrcv(msglistid,&msg,0,0,IPC_NOWAIT)>=0)		;}void WritePicManageCmd(long cmd){	ClearPipeBuff();	message msg;	msg.msgtype=cmd;	if(picctrl.threadid)	{		if(msgsnd(msglistid,&msg,0,0)<0)			printf("msg send error\n");		else printf("cmd send\n");	}}void ClosePicManageThread(){	sem_wait(&gsem);	WritePicManageCmd(PICSTOPPLAY);	sem_post(&gsem);	printf("write cmd end\n");}int parselabels(){	printf("parse lables\n");	sem_wait(&gsemlabel);	PICLABELLIST* q;	while(listhead)	{		q=listhead->next;		delete listhead;		listhead=q;	}	listhead=NULL;	FILE* pfile=fopen("labels.set","r+b");	if(!pfile) 	{		sem_post(&gsemlabel);		return 0;	}	PICLABEL psl;	PICLABELLIST* ptemp=NULL;	q=NULL;	while(fread(&psl,1,sizeof(PICLABEL),pfile)==sizeof(PICLABEL))	{		ptemp=new(PICLABELLIST);		memcpy(&ptemp->piclabel,&psl,sizeof(psl));		if(!listhead) listhead=ptemp;		if(q) q->next=ptemp;		q=ptemp;		q->next=NULL;	}	q=listhead;	while(q)	{		printf("caption:%s\n",q->piclabel.chtitle);		q=q->next;	}	sem_post(&gsemlabel);	printf("beign to repaint\n");	mainwindow->repaint();	return 1;}int recvlabels(int sock,int ilen){	ACKCMD ack;	char* buff=new char[ilen];	memset(buff,0,ilen);	printf("Labels recv len:%d",ilen);	int irecv=0;	char* ptemp=buff;	while(irecv<ilen)	{		int inow=0;		if((inow=recv(sock,ptemp,ilen-irecv,0))<0)		{			delete buff;			return -1;		}		irecv+=inow;			ptemp+=inow;	}	printf("recvd file\n");	FILE* pfile=fopen("labels.set","w+b");	fwrite(buff,1,ilen,pfile);	fclose(pfile);	delete buff;	memset(&ack,0,sizeof(ACKCMD));	//ack.cmdtype=PICSETLABEL;	if(send(sock,&ack,sizeof(ACKCMD),0)<0)	{		return -1;	}	parselabels();	return 1;}void* ClientServerThread(void* pparam){	int sock=*(int*)pparam;	printf("clientsock:%d",sock);	REQCMD reqcmd;	ACKCMD ackcmd;	PICPARAM picparam;	int 	fdfifo;	int 	chcmd;	struct  timeval timeout;	timeout.tv_sec=60; 	timeout.tv_usec=0;    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));     setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)); 	while(1)	{		memset(&reqcmd,0,sizeof(reqcmd));		if (recv(sock,&reqcmd,sizeof(reqcmd),0)!=sizeof(reqcmd))		{				printf("recv error\n");			goto _error;		}			switch(reqcmd.cmdtype)		{		case PICSETLABEL:				printf("begin recv labels\n");				if(recvlabels(sock,reqcmd.nextdatalen)<0)					gotoerror("recv labels info error\n");				break;		case PICSWITCHLBL:				gShowLbl=reqcmd.nextdatalen;				printf("switch show label :%d\n",gShowLbl);				if(sendfail(sock,&ackcmd,sizeof(ACKCMD)))					gotoerror("send ack error:picbeginplay\n");				mainwindow->repaint();				break;		case PICCAPTURE:				sem_wait(&gsem);				memset(&picparam,0,sizeof(picparam));				if(picctrl.blhasfile)					picparam.iState=1;				if(picctrl.blplaying)				{					picparam.iState|=0x0100;						if(picctrl.blpausing)					picparam.iState|=0x010000;					picparam.iReserved=picctrl.iplaytype;					strcpy(picparam.chTitle,((PICBODY*)ppicbodyarr[picctrl.inumber])->chTitle);				}				picparam.iReserved|= (gShowLbl<<8);				//printf("picctrl  pos:%d,%d\n",picctrl.iposx,picctrl.iposy);				picparam.ipos=picctrl.iposx<<16|picctrl.iposy;				picctrl.iposx=0;				picctrl.iposy=0;				sem_post(&gsem);				//printf("picparam pos:%d\n",picparam.ipos);				if(sendfail(sock,&picparam,sizeof(picparam)))					gotoerror("send info error\n");				//printf("send pic param:%x\n",picparam.iState);				break;		case PICSETPIC:				printf("recv command setpic\n");				ClosePicManageThread();				sem_wait(&gsem);				mainwindow->SetStateStr("receiving pictures....");				picctrl.blhasfile=false;				if(recvprj(sock,reqcmd.nextdatalen)==-1)				{					sem_post(&gsem);					gotoerror("recv prj error\n");				}				mainwindow->SetStateStr("");				sem_post(&gsem);				break;		case PICBEGINPLAY:				sem_wait(&gsem);				if(!picctrl.threadid)				{					pthread_create(&picctrl.threadid,NULL,PicManageThread,NULL);						ClearPipeBuff();					sleep(1);				}				else{					WritePicManageCmd(reqcmd.cmdtype);				}				sem_post(&gsem);				memset(&ackcmd,0,sizeof(ACKCMD));				if(sendfail(sock,&ackcmd,sizeof(ACKCMD)))					gotoerror("send ack error:picbeginplay\n");				break;		case PICSTOPPLAY:		case PICPAUSEPLAY:		case PICNEXT:		case PICPREVIOUS:				sem_wait(&gsem);				WritePicManageCmd(reqcmd.cmdtype);				sem_post(&gsem);				printf("write cmd end\n");				memset(&ackcmd,0,sizeof(ACKCMD));				if(sendfail(sock,&ackcmd,sizeof(ACKCMD)))					gotoerror("send ack error:picpauseplay or stop\n");				break;		}	}_error:	printf("************************************************************************\n");	printf("sock closed\n,Lock Onlline\n");	sem_wait(&gsemonline);	printf("online Locked\n");	onlineusrcount--;	printf("left online usr count:%d\n",onlineusrcount);	if (!onlineusrcount)	{		historyindex=-1;		//the fun closepicmanage will lock gsem		ClosePicManageThread();		//printf("kill retid:%d\n",pthread_kill(picctrl.threadid,0));	}	sem_post(&gsemonline);	printf("online unlicked\n");	return NULL;}void GetLocalIP(){	struct ifreq buf;	int fd;	fd=socket(AF_INET, SOCK_DGRAM, 0);	strcpy(buf.ifr_name, "eth0");	if (ioctl(fd, SIOCGIFADDR, &buf)<0)	{	   	perror("error");		close(fd);		return;	}	sprintf(localip,"%u.%u.%u.%u",			(u_char)buf.ifr_addr.sa_data[2],			(u_char)buf.ifr_addr.sa_data[3],			(u_char)buf.ifr_addr.sa_data[4],			(u_char)buf.ifr_addr.sa_data[5]);	printf(localip);	close(fd);	return;}int main(int argc,char** argv){	//create pipe	//test codec	//QTextCodec *mycode=NULL;	//for(int i=0;(mycode=QTextCodec::codecForIndex(i));i++)	//{	//		printf("code:%d,%s\n",i,mycode->name());		//getchar();	//}	//return	0;	//	printf("version:1.005\n");	GetLocalIP();	if((msglistid=msgget(2312,IPC_CREAT|0777))==-1)		printf("msg list create error\n");	//printf("msg list id:%d\n",msglistid);	sem_init(&gsem,0,0);	sem_init(&gsemonline,0,0);	sem_init(&gsemlabel,0,0);	sem_post(&gsem);	sem_post(&gsemonline);	sem_post(&gsemlabel);	ParsePrj(prjfilename);	QApplication a(argc,argv);	printf("code locale:%s\n",QTextCodec::codecForLocale()->name());	QTextCodec *my_codec = QTextCodec::codecForName("GBK");	printf(my_codec->name());	//qWarning(a.font().family());	//getchar();	//QFont font("unifont");	//a.setFont(font);	//qWarning(a.font().family());	//getchar();	//QFont font("unifont",16,50,FALSE,QFont::Unicode);    //qApp->setFont(font);	//a.setFont(QFont("cour", 16, QFont::Normal));	//QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));	//QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));	mainwindow=new CMyMainWnd();	a.setMainWidget(mainwindow);	//MessageBox("社会");	parselabels();	mainwindow->show();	pthread_t serverthread,udpthread;	pthread_create(&serverthread,NULL,&BeginServer,NULL);		pthread_create(&udpthread,NULL,&udpclient,NULL);	a.exec();	pthread_join(serverthread,NULL);	delete mainwindow;	sem_destroy(&gsem);	sem_destroy(&gsemonline);	msgctl(msglistid,IPC_RMID,NULL)<0;	return 0;}

⌨️ 快捷键说明

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