📄 tvmeetingdlg.cpp
字号:
//////////////////////////////////////////////////
}
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 + -