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

📄 net_bktcp.cpp

📁 实时监控
💻 CPP
字号:
#include "stdafx.h"
#include "net_bktcp.h"
#include "../NetDef.h"
#include "net_opt.h"
#include "net_cmdtcp.h"
#include "../notif/notif_bk.h"
#include "io.h"


extern USHORT network_bindport;
extern bool is_cmd_data(byte* buf);

//////////////////////////////////////////////////////////////////////////
//
//	class "net_bk", 备份网络线程
//
//////////////////////////////////////////////////////////////////////////
//##ModelId=3F9A1D240146
net_bktcp::net_bktcp(): 
bklength(0), bkfile(NULL), bkcb(NULL), 
exiting(true), total_bytes(0),backup_is_start(false)
{

}

//##ModelId=3F9A1D240147
net_bktcp::~net_bktcp()
{
}

//##ModelId=3F9A1D240164
bool net_bktcp::create(ULONG ip, USHORT port)
{
	exiting = false;
	total_bytes = 0;
	bkbuf.Clear();
	
	if(!net_clienttcp::create(ip, port, network_bindport++,FALSE))
	{
		destroy();
		return false;
	}
	return true;
}

//##ModelId=3F9A1D24015A
void net_bktcp::destroy()
{
	backup_is_start = false;
	exiting = true;
	Sleep(10);

	net_clienttcp::destroy();
	bkbuf.Clear();
	bklength = 0;
	bkfile = NULL;
	total_bytes = 0;

	bkcb = NULL;
}

void net_bktcp::terimt_destroy()
{
	backup_is_start = false;
	exiting = true;
	Sleep(10);

	net_clienttcp::clossock();
	bkbuf.Clear();
	bklength = 0;
	bkfile = NULL;
	total_bytes = 0;

	bkcb = NULL;
}

//##ModelId=3F9A1D240129
bool net_bktcp::on_net_tcp_recv(byte* buf, int length, ULONG from_ip, USHORT from_port)
{
	if( exiting )
		return false;

	if(is_cmd_data(buf))
	{
		if( buf[10] != NETCOM_BACKUP_FILEHEAD && buf[10] != NETCOM_BACKUP_END)
		{
			net_cmdtcp *p =	net_cmdtcp::m_netcmdp;
			if(p)
				p->on_net_tcp_recv(buf, length, from_ip, from_port, 0);
		
			return true;
		}
	}

	total_bytes += length;
	//TRACE("total_bytes: %d\n", total_bytes);
	/*
	 *	收到备份数据 ( 来自net_tcp::got_something() @ thread#net_tcp::thread_base )
	 */
	return write_backup_data(buf, length) ;

	//Sleep(1);
}

//##ModelId=3F9A1D240151
void net_bktcp::set_path(LPCTSTR p)
{
	path = p;
}

void net_bktcp::send_data()
{
	unsigned char buf[120];
	int length = m_send_buf.GetAudioData(buf,120);
	if(length >0)
	{
	  send_something((char*)buf, length);
	}
}

void net_bktcp::set_bkcb(CALLEE cb)
{
	bkcb = cb;
}
//##ModelId=3F9A1D240100
bool net_bktcp::write_backup_data(byte* buf, int length)
{
	//TRACE("[backup] received %d bytes\n", length);
	if( bkcb )
	{
		POST_NOTIFY(bkcb, NTM_BK_PROGRESS, get_clientip(), total_bytes) ;
	}

	bkbuf.PutBackupData(buf, length);

	for ( int i=0;; i++)
	{
		if( exiting )
			return false;

		if (bkbuf.nFrameLen)  
		{  //
			if (!RcvBackupFrameData())
				break;
		}
		else
		{  //new frame
			int m_revalue = RcvBackupNewFrameData();
			if (!m_revalue)
				break;
			if(m_revalue == 2)
				return false;
		}
	}
	return true;
}

//##ModelId=3F9A1D240114
BOOL net_bktcp::RcvBackupFrameData()
{
	int  len, rest ;
	len = bkbuf.GetBackupBufLen() ;
	if (len >= bkbuf.nFrameLen)  {  //save a frame data
		rest = BACKUP_BUF_LEN - bkbuf.nRr ;
		if (rest >= bkbuf.nFrameLen)  {
			if (bkfile)
			{
				fwrite(bkbuf.buf + bkbuf.nRr, bkbuf.nFrameLen, 1, bkfile) ;
				bklength += bkbuf.nFrameLen;
			}
			bkbuf.nRr += bkbuf.nFrameLen ;
			if (bkbuf.nRr >= BACKUP_BUF_LEN)
				bkbuf.nRr = 0 ;
		}
		else  {
			if (bkfile)
			{
				fwrite(bkbuf.buf + bkbuf.nRr, rest, 1, bkfile) ;
				fwrite(bkbuf.buf, bkbuf.nFrameLen - rest, 1, bkfile) ;
				bklength += rest;
				bklength += bkbuf.nFrameLen - rest;
			}
			bkbuf.nRr = bkbuf.nFrameLen - rest ;
		}
		bkbuf.nFrameLen = 0 ;
		bkbuf.nFrameType = END_FRAMEFLAG ;
		return TRUE ;
	}
	else
		return FALSE ;
}

//##ModelId=3F9A1D240115
int net_bktcp::RcvBackupNewFrameData()
{
	int			   m_typereturn;
	int            len ;
	unsigned long  size ;
	
	len = bkbuf.GetBackupBufLen() ;
	if (len < 20)
		return 0 ;
	
	switch (bkbuf.buf[bkbuf.nRr])  {
	case  'S' :  //file head
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;

		m_typereturn = is_backup_header(bkbuf.nRr);
		if (m_typereturn == 1 )  
		{
			bkbuf.nRr += 19 ;
			if (bkbuf.nRr >= BACKUP_BUF_LEN)
				bkbuf.nRr -= BACKUP_BUF_LEN ;
		}

		if(m_typereturn == 2)
			return 2;
		break ;
	case  VIDEO_KEYFRAME :
		//main->SendMessage(WM_NET_BACKUP_FILE, 0, 0) ;
		if( bkcb )
		{
			POST_NOTIFY(bkcb, NTM_BK_PROGRESS, get_clientip(), 0);
		}
	case  VIDEO_FRAME :
	case  AUDIO_FRAME :
		bkbuf.nFrameType = bkbuf.buf[bkbuf.nRr] ;
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;
		bkbuf.nFrameLen = bkbuf.buf[bkbuf.nRr] ;
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;
		bkbuf.nFrameLen += ((bkbuf.buf[bkbuf.nRr])<<8) ;
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;
		bkbuf.nFrameLen += ((bkbuf.buf[bkbuf.nRr])<<16) ;
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;

		if (bkfile)  {
			size = ftell(bkfile) ;
			if (bkbuf.nFrameType == AUDIO_FRAME)
				size |= 0x40000000 ;
			if (bkbuf.nFrameType == VIDEO_FRAME)
				size |= 0x80000000 ;
			if (bkbuf.nFrameType == VIDEO_KEYFRAME)
				size |= 0xc0000000 ;
			fseek(bkfile, bkbuf.nFrameNum*4, SEEK_SET) ;
			fwrite((byte*)(&size), 4, 1, bkfile) ;
			fseek(bkfile, 0, SEEK_END) ;
			bkbuf.nFrameNum ++ ;
		}
		break ;
	default :
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;
		break ;
	}
	return 1 ;
}

//##ModelId=3F9A1D24011E
int net_bktcp::is_backup_header(int pos)
{
	int             i ;
	unsigned char   Buf[10], pFileBuf[32768] ;
	CString         str ;
	
	if (bkbuf.buf[pos] != 'D')
		return 0 ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	if (bkbuf.buf[pos] != 'V')
		return 0 ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	if (bkbuf.buf[pos] != 'R')
		return 0 ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	
	pos += 6;
	if (bkbuf.buf[pos] != NETCOM_BACKUP_FILEHEAD)  
	{
		if (bkbuf.buf[pos] == NETCOM_BACKUP_END)  
		{  //backup end
			if( bkcb )
			{
				if( bkfile )
				{
					POST_NOTIFY(bkcb, NTM_BK_FINISHED, get_clientip(), 0);
				}
				else
				{
					POST_NOTIFY(bkcb, NTM_BK_EMPTY, get_clientip(), 0);
				}
			}
			if (bkfile)  {
				fclose(bkfile) ;
				bkfile = NULL ;
			}
			//EndBackupSocket() ;
			
			net_cmdtcp *p =	net_cmdtcp::m_netcmdp;
			if(p)
				p->delete_bak_talk_inf(get_clientip(), get_clientport(), p->bak_list, false);
			//destroy();
			//main->SendMessage(WM_NET_BACKUP_END, 0, 0) ;
			return 2 ;
		}
		return 0 ;
	}
	for (i=0;i<9;i++)  
	{
		if (++pos >= BACKUP_BUF_LEN)
			pos = 0 ;
		Buf[i] = bkbuf.buf[pos] ;
	}
	if (bkfile)  {
		fclose(bkfile) ;
		bkfile = NULL ;
	}
	//new file
	bkbuf.nFrameNum = 0 ;
	str.Format(_T("%s\\%02d%02d%02d%c%c.MOV"), path, Buf[4], Buf[5], Buf[6], Buf[7], Buf[8]) ;
	bkfile = fopen(str, _T("wb")) ;
	if( !bkfile )
	{
 		POST_NOTIFY(bkcb, NTM_BK_FAILED, get_clientip(), 0);
		net_cmdtcp *p =	net_cmdtcp::m_netcmdp;
		if(p)
			p->delete_bak_talk_inf(get_clientip(), get_clientport(), p->bak_list, false);
		return 2;
	}
	TRACE("backup: create file %s\n", str);
	memset(pFileBuf, 0, 32768) ;
	fwrite(pFileBuf, 32768, 1, bkfile) ;
	
	return 1;
}

⌨️ 快捷键说明

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