www.gusucode.com > 一个可以在局域网进行视频聊天的源代码 > 一个可以在局域网进行视频聊天的源代码/VoIP/CommClient.cpp

    // CommClient.cpp: implementation of the CCommClient class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VoIP.h"
#include "CommClient.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCommClient::CCommClient()
{
	WSADATA				dat;

	// 初始化Socket
	WSAStartup(MAKEWORD(2,2),&dat);

	m_Sequence		= 0;
}

CCommClient::~CCommClient()
{
	// 释放资源
	WSACleanup();	
}

//////////////////////////////////////////////////////////////////////////
//
// 连接转发服务器
//
BOOL CCommClient::ConnectServer()
{
	RTPUDPv4TransmissionParams		transparams;
	RTPSessionParams				sessparams;
	int								status;
	uint32_t						utServerIP;
	RTPIPv4Address					addr;
		
	// 创建通信ID
	CoCreateGuid( &m_CommID );
	m_TransSession.SetCommID( m_CommID );
	
	// 转换Server地址
	utServerIP		= ntohl( inet_addr( m_szServerIP ) );
	
	sessparams.SetOwnTimestampUnit( 1.0/8000.0 );
	sessparams.SetMaximumPacketSize( 64000 );
	sessparams.SetAcceptOwnPackets( true );
	sessparams.SetSourceTimeoutMultiplier( 50 );
	sessparams.SetUsePollThread( true );
	transparams.SetPortbase( 7000 );
	m_TransSession.Create( sessparams, &transparams );
	m_TransSession.SetMessageWindows( m_wMessageWnd );

	RTPIPv4Address SendAddr( utServerIP, m_uiServerPort );
	status = m_TransSession.AddDestination( SendAddr );
	transparams.SetPortbase( 7002 );
	m_RecvSession.Create( sessparams, &transparams );
	m_RecvSession.SetMessageWindows( m_wMessageWnd );
	
	RTPIPv4Address RecvAddr( utServerIP, m_uiLocalPort );
	status = m_RecvSession.AddDestination( RecvAddr );
	m_TransSession.SetDefaultPayloadType( 0 );
	m_TransSession.SetDefaultMark( false );
	m_TransSession.SetDefaultTimestampIncrement( 10 );
	

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////
//
// 设置本地端口
//
void CCommClient::SetLocalPort(UINT uiLocalPort)
{
	m_uiLocalPort	= uiLocalPort;
}

//////////////////////////////////////////////////////////////////////////
//
// 设置消息通知窗口句柄
//
void CCommClient::SetMessageWindows(HWND hWnd)
{
	m_wMessageWnd	= hWnd;
}

void CCommClient::SetTransServer(const char *szServerIP, UINT uiServerPort)
{
	m_szServerIP	= szServerIP;
	m_uiServerPort	= uiServerPort;
}

//////////////////////////////////////////////////////////////////////////
//
// 发送数据
//
BOOL CCommClient::SendPacket(const char *pDataBuffer, UINT uiDataSize, UINT DataType)
{
	char*			pSendBuffer;
	PTR_SEED_HEAD	pSeedHead;
	int				iSendSize;
	
	iSendSize		= uiDataSize + sizeof(SEED_HEAD);
	pSendBuffer		= (char*)malloc( iSendSize );
	memset( pSendBuffer, 0, iSendSize );
	
	pSeedHead		= (PTR_SEED_HEAD)pSendBuffer;
	memcpy( pSeedHead, &m_CommID, sizeof(GUID) );
	pSeedHead->DataLength	= uiDataSize;
	pSeedHead->DataPostion	= m_Sequence++;
	pSeedHead->DataType		= DataType;
	memcpy( pSendBuffer+sizeof(SEED_HEAD), pDataBuffer, uiDataSize );

	// 发送数据
	m_TransSession.SendPacket( pSendBuffer, iSendSize );

	free( pSendBuffer );

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////
//
// 注销服务器
//
void CCommClient::DisconnectServer()
{
	m_TransSession.BYEDestroy(RTPTime(10,0),0,0);
}