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

📄 net_bk.cpp

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

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

}

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

//##ModelId=3F9A1D240164
bool net_bk::create(net_addr& na,int type)
{
	exiting = false;
	finished = false;
	total_bytes = 0;
	bkbuf.Clear();
	return net_tcp::create(na,type);
}

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

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

	bkcb = NULL;
}

//##ModelId=3F9A1D240129
void net_bk::on_recv(byte* buf, int length)
{
	if( exiting )
		return;
	if(finished)
		return;

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

	//Sleep(1);
}

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

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

	bkbuf.PutBackupData(buf, length);

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

		if( finished)
			break;

		if (bkbuf.nFrameLen)  
		{  //
			if (!RcvBackupFrameData())
				break ;
		}
		else
		{  //new frame
			if (!RcvBackupNewFrameData())
				break ;
		}
	}
}

//##ModelId=3F9A1D240114
BOOL net_bk::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
BOOL net_bk::RcvBackupNewFrameData()
{
	int            len ;
	unsigned long  size ;
	
	len = bkbuf.GetBackupBufLen() ;
	if (len < 14)
		return FALSE ;
	switch (bkbuf.buf[bkbuf.nRr])  {
	case  'T' :  //file head
		if (++bkbuf.nRr >= BACKUP_BUF_LEN)
			bkbuf.nRr = 0 ;
		if (is_backup_header(bkbuf.nRr))  {
			bkbuf.nRr += 13 ;
			if (bkbuf.nRr >= BACKUP_BUF_LEN)
				bkbuf.nRr -= BACKUP_BUF_LEN ;
		}
		break ;
	case  VIDEO_KEYFRAME :
		//main->SendMessage(WM_NET_BACKUP_FILE, 0, 0) ;
		if( bkcb )
		{
			POST_NOTIFY(bkcb, NTM_BK_PROGRESS, GetIpAddr(), 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 TRUE ;
}

//##ModelId=3F9A1D24011E
BOOL net_bk::is_backup_header(int pos)
{
	int             i ;
	unsigned char   Buf[10], pFileBuf[32768] ;
	CString         str ;
	
	if (bkbuf.buf[pos] != 'M')
		return FALSE ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	if (bkbuf.buf[pos] != 'V')
		return FALSE ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	if (bkbuf.buf[pos] != 'D')
		return FALSE ;
	if (++pos >= BACKUP_BUF_LEN)
		pos = 0 ;
	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, GetIpAddr(), 0);
				}
				else
				{
					POST_NOTIFY(bkcb, NTM_BK_EMPTY, GetIpAddr(), 0);
				}
			}
			if (bkfile)  {
				fclose(bkfile) ;
				bkfile = NULL ;
			}
			//EndBackupSocket() ;
			destroy();
			//main->SendMessage(WM_NET_BACKUP_END, 0, 0) ;
			return TRUE ;
		}
		return FALSE ;
	}
	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, GetIpAddr(), 0);
		destroy();
		return FALSE;
	}
	TRACE("backup: create file %s\n", str);
	memset(pFileBuf, 0, 32768) ;
	fwrite(pFileBuf, 32768, 1, bkfile) ;
	
	return TRUE;
}

⌨️ 快捷键说明

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