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

📄 tvmeetingdlg.cpp

📁 用c++做的视频会议源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			//////////////////////////////////////////////////

		}
		if (g_nCount==0)
		{
			g_eventStart.SetEvent();
		}
		g_eventKill.SetEvent();
		m_ClientInfoList.RemoveAll(); //wzz 2003-4-3
		// added by rc 04031611
		DeleteCriticalSection(&m_cs);
		DestroyWindow();
		PostNcDestroy();
		CDialog::OnDestroy();
		
	}

	//CDialog::OnCancel();
}



void CTVMeetingDlg::UpdateStatusBarInfo(CString Info) 
{
	SetDlgItemText(IDC_STATUS,Info);
}

int CTVMeetingDlg::StartUp()
{
	WORD    wVersionRequested;
	WSADATA wsaData;
	int     err; 
	wVersionRequested = MAKEWORD( 2, 0 ); 
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		// Couldn't find a usable WinSock DLL.                                  */    
		return err;
	} 
	// Confirm that the WinSock DLL supports 2.0.
	// Note that if the DLL supports versions greater
	// than 2.0 in addition to 2.0, it will still return
	// 2.0 in wVersion since that is the version we
	// requested. 
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 0 ) {
		// Couldn't find a usable WinSock DLL.
		WSACleanup( );
		return WSAVERNOTSUPPORTED; 
	} 	
	// The WinSock DLL is acceptable
	return 0;
}

int CTVMeetingDlg::CleanUp()
{
	int nRetCode;

	nRetCode = WSACleanup();
	if (nRetCode != 0) {
		// An error occured. 
		return WSAGetLastError();
	}
	return 0; 
}
int CTVMeetingDlg::GetLocalHostName(CString& sHostName)
{

	char szHostName[256];
	int  nRetCode;

	nRetCode = gethostname(szHostName, sizeof(szHostName));

	if (nRetCode != 0) {
		// An error has occurred
		sHostName = _T("Not available");;
		return WSAGetLastError();
	}

	sHostName = szHostName;
	return 0;
}

int CTVMeetingDlg::GetIPAddress(const CString& sHostName, CString& sIPAddress)
{
	struct hostent FAR *lpHostEnt = gethostbyname (sHostName);

	if (lpHostEnt == NULL) {
		// An error occurred. 
		sIPAddress = _T("");
		return WSAGetLastError();
	}

	LPSTR lpAddr = lpHostEnt->h_addr_list[0];
	if (lpAddr) {
		struct in_addr  inAddr;
		memmove (&inAddr, lpAddr, 4);
		sIPAddress = inet_ntoa (inAddr);
		if (sIPAddress.IsEmpty())
			sIPAddress = _T("Not available");
	}		
	return 0;
}
bool CTVMeetingDlg::GetMSPeerName(CSocket *pSocket,CString& sIPAddress,UINT& Port)
{
	if (pSocket!=NULL)
	{
		if (pSocket->GetPeerName(sIPAddress,Port))
			return true;
		else
			return false;
	}
	else
		return false;
}
void CTVMeetingDlg::WriteLogInfoToCtrl(CString Info)
{
	CRichEditCtrl *pEdit;
	pEdit=(CRichEditCtrl*)GetDlgItem(IDC_LOG_INFO);
	Info+="\r\n";
	int len=0;
	len = pEdit->GetTextLength();
	pEdit->SetSel(len,len);
	pEdit->ReplaceSel(Info);
	int count=pEdit->GetLineCount();
	//pEdit->LineScroll(count);
	if (count>m_nLogInfoLines)
	{
		SetDlgItemText(IDC_LOG_INFO,"");
	}

}

/*------------------------------------------------------------------------------*/
//初始化SOCKET,指定PORT
BOOL CTVMeetingDlg::InitSocket(int m_nSockFlag)
{
	
	DestroySocket(m_nSockFlag);
	BOOL bRet=FALSE;	
	if (m_nSockFlag==SOCK_CMD)
	{
		if(!m_CMDSocket.Create(PORT))
			goto RET;
		//创建socket线程(socket为block方式)
		m_hCmdSockThread=CreateThread(0,0,SockCmdThreadProc,(LPVOID)this,0,&m_dwCmdSockThreadId);
		if(!m_hCmdSockThread)	
			goto RET;
	}
	else
	if (m_nSockFlag==SOCK_AUDIO_REC1)
	{
		if(!m_ARecSocket1.Create(PORT+11))
			goto RET;
		
		m_hARecSockThread1=CreateThread(0,0,SockARecThreadProc1,(LPVOID)this,0,&m_dwARecSockThreadId1);
		if(!m_hARecSockThread1)	
			goto RET;

		//创建socket线程(socket为block方式)
		
	}
		else
	if (m_nSockFlag==SOCK_AUDIO_REC2)

	{
		if(!m_ARecSocket2.Create(PORT+12))
			goto RET;
		
		m_hARecSockThread2=CreateThread(0,0,SockARecThreadProc2,(LPVOID)this,0,&m_dwARecSockThreadId2);
		if(!m_hARecSockThread2)	
			goto RET;

		//创建socket线程(socket为block方式)
		
	}
		else
	if (m_nSockFlag==SOCK_AUDIO_REC3)

	{
		if(!m_ARecSocket3.Create(PORT+13))
			goto RET;
		
		m_hARecSockThread3=CreateThread(0,0,SockARecThreadProc3,(LPVOID)this,0,&m_dwARecSockThreadId3);
		if(!m_hARecSockThread3)	
			goto RET;

		//创建socket线程(socket为block方式)
		
	}
	else
	if (m_nSockFlag==SOCK_AV)

	{
		if(!m_AVSocket.Create(PORT+1))
			goto RET;
		
		m_hAVSockThread=CreateThread(0,0,SockAVThreadProc,(LPVOID)this,0,&m_dwAVSockThreadId);
		if(!m_hAVSockThread)	
			goto RET;

		//创建socket线程(socket为block方式)
		
	}
	
	bRet=TRUE;
RET:
	if(!bRet)
	{
		DestroySocket(m_nSockFlag);
	}	
	return bRet;
}

/*------------------------------------------------------------------------------*/

BOOL CTVMeetingDlg::DestroySocket(int m_SockFlag)
{
	if (m_SockFlag==SOCK_CMD)
	{
		m_CMDSocket.Destroy();
		////////////////////////////////////////////////////////////////////////
		if(m_hCmdSockThread)
		{
			BOOL b=FALSE;
			DWORD ExitCode;
			int Timeout = 10;
			while(Timeout)//等待线程结束,如果到一定时间还没结束,就强制结束
			{			 //因为Socket已经destroy了,所以socket线程会返回
				GetExitCodeThread(m_hCmdSockThread, &ExitCode);
				
				if (ExitCode != STILL_ACTIVE)
				{
					b=TRUE;
					// Thread has ended.
					break;
				}
				else
				{
					Sleep(10);
				}
				
				--Timeout;
			}
			if(!b)//time out ,terminate it
				TerminateThread(m_hCmdSockThread,0);
					
		}
		m_hCmdSockThread=NULL;
		///////////////////////////////////////////////////////////////////////
	}
	else
	if (m_SockFlag==SOCK_AUDIO_REC1)
	{
		m_ARecSocket1.Destroy();  // wzz 2003-4-3
		/////////////////////////////////////////////////////////////////////
		if(m_hARecSockThread1)
		{
			BOOL b=FALSE;
			DWORD ExitCode;
			int Timeout = 10; //wzz 2003-4-3
			while(Timeout)//等待线程结束,如果到一定时间还没结束,就强制结束
			{			 //因为Socket已经destroy了,所以socket线程会返回
				GetExitCodeThread(m_hARecSockThread1, &ExitCode);
				
				if (ExitCode != STILL_ACTIVE)
				{
					b=TRUE;
					// Thread has ended.
					break;
				}
				else
				{
					Sleep(10);
				}
				
				--Timeout;
			}
			if(!b)//time out ,terminate it
				TerminateThread(m_hARecSockThread1,0);
					
		}
		
		m_hARecSockThread1=NULL;
		//////////////////////////////////////////////////////////////////////
		
	}
	else
	if (m_SockFlag==SOCK_AUDIO_REC2)
	{
		m_ARecSocket2.Destroy();  // wzz 2003-4-3
		/////////////////////////////////////////////////////////////////////
		if(m_hARecSockThread2)
		{
			BOOL b=FALSE;
			DWORD ExitCode;
			int Timeout = 10; //wzz 2003-4-3
			while(Timeout)//等待线程结束,如果到一定时间还没结束,就强制结束
			{			 //因为Socket已经destroy了,所以socket线程会返回
				GetExitCodeThread(m_hARecSockThread2, &ExitCode);
				
				if (ExitCode != STILL_ACTIVE)
				{
					b=TRUE;
					// Thread has ended.
					break;
				}
				else
				{
					Sleep(10);
				}
				
				--Timeout;
			}
			if(!b)//time out ,terminate it
				TerminateThread(m_hARecSockThread2,0);
					
		}
		
		m_hARecSockThread2=NULL;
		//////////////////////////////////////////////////////////////////////
		
	}
	else
	if (m_SockFlag==SOCK_AUDIO_REC3)
	{
		m_ARecSocket3.Destroy();  // wzz 2003-4-3
		/////////////////////////////////////////////////////////////////////
		if(m_hARecSockThread3)
		{
			BOOL b=FALSE;
			DWORD ExitCode;
			int Timeout = 10; //wzz 2003-4-3
			while(Timeout)//等待线程结束,如果到一定时间还没结束,就强制结束
			{			 //因为Socket已经destroy了,所以socket线程会返回
				GetExitCodeThread(m_hARecSockThread3, &ExitCode);
				
				if (ExitCode != STILL_ACTIVE)
				{
					b=TRUE;
					// Thread has ended.
					break;
				}
				else
				{
					Sleep(10);
				}
				
				--Timeout;
			}
			if(!b)//time out ,terminate it
				TerminateThread(m_hARecSockThread3,0);
					
		}
		
		m_hARecSockThread3=NULL;
		//////////////////////////////////////////////////////////////////////
		
	}
	else
	if (m_SockFlag==SOCK_AV)
	{
		m_AVSocket.Destroy();  // wzz 2003-4-3
		/////////////////////////////////////////////////////////////////////
		if(m_hAVSockThread)
		{
			BOOL b=FALSE;
			DWORD ExitCode;
			int Timeout = 10; //wzz 2003-4-3
			while(Timeout)//等待线程结束,如果到一定时间还没结束,就强制结束
			{			 //因为Socket已经destroy了,所以socket线程会返回
				GetExitCodeThread(m_hAVSockThread, &ExitCode);
				
				if (ExitCode != STILL_ACTIVE)
				{
					b=TRUE;
					// Thread has ended.
					break;
				}
				else
				{
					Sleep(10);
				}
				
				--Timeout;
			}
			if(!b)//time out ,terminate it
				TerminateThread(m_hAVSockThread,0);
					
		}
		
		m_hAVSockThread=NULL;
		//////////////////////////////////////////////////////////////////////
		
	}
	//
	
	
	return TRUE;
}
DWORD WINAPI CTVMeetingDlg::SockCmdThreadProc(LPVOID lpParameter)
{
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;

	char buf[MAX_TEXT_BUFFER+20];
	int iLen=0;
	while(1)
	{
		iLen=pDlg->m_CMDSocket.RecvFrom(buf,MAX_TEXT_BUFFER+20,(sockaddr*)&pDlg->m_sockaddr);
		if(iLen>0)
		{	
			switch(*((short*)buf))//check the flag
			{
			case FLAG_CMD:
				{
				//命令
					pDlg->OnCommand((PACK_CMD*)buf,iLen,pDlg->m_sockaddr);	
				}
				break;
			case FLAG_TEXT:
				{
				//命令
					pDlg->OnTextInfo((PACK_TEXT*)buf,iLen,pDlg->m_sockaddr);	
				}
				break;
			}
			
		}
		else
		{
			if(!pDlg->m_CMDSocket.IsSocket())
				break;
		}//the socket should be closed,that is m_Socket have been
		//destroyed,so break the loop and end the thread
	}
	return 0;
}

DWORD WINAPI CTVMeetingDlg::SockAVThreadProc(LPVOID lpParameter)
{
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	CString strRecieve;
	char buf[4096];
	int iLen=0;
	sockaddr_in AVAddr;
	while(1)
	{
		iLen=pDlg->m_AVSocket.RecvFrom(buf,4096,(sockaddr*)&AVAddr);
		if(iLen>0)
		{
			
			switch(*((short*)buf))//check the flag
			{
				case FLAG_VIDEO:
				{
					//Video Data
					
					POSITION pos;
					if(pDlg->m_ClientInfoList.GetCount()==0)
						break;
					for( pos = pDlg->m_ClientInfoList.GetHeadPosition(); pos != NULL; )
					{				
						CClientInfo *pClientInfo=pDlg->m_ClientInfoList.GetAt(pos);
						if (pClientInfo!=NULL)
						{
							strRecieve.Format("%d.%d.%d.%d",
								AVAddr.sin_addr.S_un.S_un_b.s_b1,
								AVAddr.sin_addr.S_un.S_un_b.s_b2,
								AVAddr.sin_addr.S_un.S_un_b.s_b3,
								AVAddr.sin_addr.S_un.S_un_b.s_b4);
							////////////////////////////////////////////////////////////////////
							if(strRecieve == pClientInfo->m_szIP)
							{
								pDlg->OnDecodeVideoData((PACK_VIDEO*)buf,iLen,pClientInfo->UID,pClientInfo->bMain);
								pClientInfo=NULL;
								delete pClientInfo;
								break;
							}
							////////////////////////////////////////////////////////////////////
						}
						pDlg->m_ClientInfoList.GetNext(pos);
					}
				}
				break;
			}
			
		}
		else
		{
			if(!pDlg->m_AVSocket.IsSocket())
				break;
		}//the socket should be closed,that is m_Socket have been
		//destroyed,so break the loop and end the thread
	}
	return 0;
}
DWORD WINAPI CTVMeetingDlg::SockARecThreadProc1(LPVOID lpParameter)
{
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	CString strRecieve,strIP;
	char buf[244];
	int iLen=0;
	sockaddr_in m_addrIn;
	while(1)
	{
		iLen=pDlg->m_ARecSocket1.RecvFrom(buf,244,(sockaddr*)&m_addrIn);
		TRACE1("Recieve Len Audio : %d \r\n",iLen);
		if(iLen>0)
		{
			

⌨️ 快捷键说明

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