www.pudn.com > AVChat0926.rar > CClientAdmin.cpp


// 
// CClientAdmin.cpp 
// 
 
/*-----------------------------------------------------*\ 
			HQ Tech, Make Technology Easy!        
 More information, please go to http://hqtech.nease.net. 
/*-----------------------------------------------------*/ 
 
/************************************************************************/ 
/*  
    说明:主要用来控制作为客户端的程序行为.得于一些有关远程主机的IP,端口等信息. 
*/ 
/************************************************************************/ 
 
#include "stdafx.h" 
#include  
#include "CClientAdmin.h" 
#include "GlobalDefs.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////// 
CClientAdmin::CClientAdmin() 
{ 
	//命令传输端口号 
	mLocalUDPPort  = CLIENT_UDP_PORT;		//表示在CLIENT_UDP_PORT端口建立一个UDP监听 
	mTargetUDPPort = SERVER_UDP_PORT;		//表示命令要发送到远程主机的SERVER_UDP_PORT端口 
 
	//媒体数据必须要设置的接收数据的端口号 
	//这里最好使用灵活的设置方式,端口号,IP地址均可自由设置,由构造函数带进来或直接设置 
	mVideoStream.SetLocalPort(VIDEO_UDP_PORT); 
	mAudioStream.SetLocalPort(AUDIO_UDP_PORT); 
} 
 
CClientAdmin::~CClientAdmin() 
{ 
	//Uninit(); 
} 
 
//BOOL CClientAdmin::Init(void) 
//{ 
//	return CRoleAdmin::Init(); 
//} 
// 
//void CClientAdmin::Uninit(void) 
//{ 
//	CRoleAdmin::Uninit(); 
//} 
 
//发送请求语音讨论的命令 
BOOL CClientAdmin::CallServer(void) 
{ 
	return SendSimpleCommand(cmd_ClientCalling); 
} 
 
WORD CClientAdmin::GetVideoStreamReceivePort(void) 
{ 
	return mVideoStream.GetLocalPort(); 
} 
 
SOCKET CClientAdmin::GetVideoStreamSocketSender() 
{ 
	return mVideoStream.GetSocketSender(); 
} 
 
WORD CClientAdmin::GetAudioStreamReceivePort(void) 
{ 
	return mAudioStream.GetLocalPort(); 
} 
 
SOCKET CClientAdmin::GetAudioStreamSocketSender() 
{ 
	return mAudioStream.GetSocketSender(); 
} 
 
SOCKADDR_IN CClientAdmin::GetAudioTargetAddr() 
{ 
	SOCKADDR_IN Addr; 
	memset(&Addr,0,sizeof(Addr)); 
	memset((char *) &Addr, 0, sizeof(Addr));   
	Addr.sin_family      = AF_INET; 
	Addr.sin_addr.s_addr = htonl(mTargetIP); 
	Addr.sin_port        = htons(AUDIO_UDP_PORT); 
	return Addr; 
} 
 
SOCKADDR_IN CClientAdmin::GetVideoTargetAddr() 
{ 
	SOCKADDR_IN Addr; 
	memset(&Addr,0,sizeof(Addr)); 
	memset((char *) &Addr, 0, sizeof(Addr));   
	Addr.sin_family      = AF_INET; 
	Addr.sin_addr.s_addr = htonl(mTargetIP); 
	Addr.sin_port        = htons(VIDEO_UDP_PORT); 
	return Addr; 
} 
 
bool CClientAdmin::ReceiveMessage(MessageT inMessage,  
								  void * ioParam,  
								  void * ioParam2) 
{ 
	switch (inMessage) 
	{ 
	case msg_UDPCommandReceived: 
		{ 
			UDP_Pack * pCmd = (UDP_Pack*) ioParam; 
			pCmd->my_ntoh(); 
			// Process different commands 
			switch (pCmd->command) 
			{ 
			case cmd_DeviceConfig: 
				// Save the remote device config 
				SetDeviceConfig(pCmd->param1 << 2); 
				// Send local device config to the peer 
				SendLocalDeviceConfigToPeer(); 
				break; 
 
			case cmd_DisconnectRequest: 
				{ 
					BOOL isBuilding = FALSE; 
					Broadcast(msg_ModifyFilterGraph, &isBuilding); 
				} 
				break; 
			case cmd_UDPSocketAccepted: 
				{		 
					mVideoStream.SetTargetIP(mMulticastIP); 
					mVideoStream.SetTargetPort(VIDEO_UDP_PORT); 
					mVideoStream.CreateSender(); 
 
					mAudioStream.SetTargetIP(mMulticastIP); 
					mAudioStream.SetTargetPort(AUDIO_UDP_PORT); 
					mAudioStream.CreateSender(); 
					 
					SendSimpleCommand(cmd_BuildFilterGraph); 
					// Now the client must begin to build filter graph too 
					BOOL isBuilding = TRUE; 
					Broadcast(msg_ModifyFilterGraph, &isBuilding); 
				} 
			} 
		} 
		return true; 
	} 
 
	return CRoleAdmin::ReceiveMessage(inMessage, ioParam, ioParam2); 
}