📄 net_bktcp.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 + -