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

📄 netbase.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
字号:
// NetBase.cpp : implementation file
//

#include "stdafx.h"
#include "lane_new.h"
#include "NetBase.h"

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

extern CLane_newApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CNetBase

/*	初始化接收/发送窗口及CRC校验表 */
CNetBase::CNetBase()
{
	uChLocalReceiveIndex=0;
	uChLocalSendIndex=0;
	bPointEquFlag=FALSE;
	InitialCRC();
}

// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CNetBase, CSocket)
	//{{AFX_MSG_MAP(CNetBase)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CNetBase member functions

//	处理来自网络的数据,所有有效数据以0xfd开头,以0xfe结尾,长度不可
//	小于6个字节;紧跟着0xfd的是车道地址,如果数据不是发给本车道的,该
//	帧数据被丢弃,否则处理该帧数据
void CNetBase::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	unsigned char tmpStr[500];
	int nDataLen;
	memset(tmpStr,0,500);
	nDataLen=Receive(tmpStr,500);
	if(nDataLen<6) return;				//增加于2001/6/25日
	if(tmpStr[0]==0xfd){				//有效信息以0xfd字符开始,0xfe结束
		if(tmpStr[nDataLen-1]==0xfe){
			int Addr=(tmpStr[1]-'0')*10+tmpStr[2]-'0';
			if(GetLaneAddr()==Addr){
				ProcessReceiveData(tmpStr,nDataLen);//是否为发给本机的信息
			}
		}
	}	
	CSocket::OnReceive(nErrorCode);
}

/*	关闭网络连接 */
void CNetBase::NetworkClose()
{
	Close();
}

/*	初始化CRC校验表 */
void CNetBase::InitialCRC()
{
	for(int i=0;i<256;i++){
		CRCTable[i]=CalculateCRC(i,POLY,0);
	}
}

/*	计算CRC校验表 */
unsigned short CNetBase::CalculateCRC(unsigned short Data, unsigned short Genpoly, unsigned short Accum)
{
	Data<<=8;
	for(int i=8;i>0;i--){
		if((Data^Accum)&0x8000){
			Accum=(Accum<<1)^Genpoly;
		} else {
			Accum<<=1;
		}
		Data<<=1;
	}
	return(Accum);
}

/*	计算CRC校验结果 */
unsigned short CNetBase::UpDateCRC(unsigned short CheckResult, unsigned char ch)
{
	return((CheckResult<<8)^CRCTable[(CheckResult>>8)^ch]);
}

/*	获取车道地址 */
int CNetBase::GetLaneAddr()
{
	CLaneInfo m_clsLane;
	return m_clsLane.LaneAddr();
}

/*	获取本地消息通讯端口号 */
int CNetBase::GetLocalMessagePort()
{
	CLaneInfo m_clsLane;
	int PortNO=m_clsLane.LocalPort();
	if(PortNO<1024){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"本地消息端口号设置错误,用缺省端口6767\n");
		return 6767;
	}
	return PortNO;
}

/*	获取本地图像通讯端口号:消息通讯端口号减2 */
int CNetBase::GetLocalPicturePort()
{
	CLaneInfo m_clsLane;
	int PortNO=m_clsLane.LocalPort()-2;
	if(PortNO<1024){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"本地图象端口号设置错误,用缺省端口6765\n");
		return 6765;
	}
	return PortNO;
}

/*	获取消息服务器端口号 */
int CNetBase::GetMessageServerPort()
{
	CLaneInfo m_clsLane;
	int PortNO=m_clsLane.MessagePort();
	if(PortNO<1024){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"消息服务器端口号设置错误,用缺省端口6768\n");
		return 6768;
	}
	return PortNO;
}

/*	获取消息服务器IP地址 */
void CNetBase::GetMessageServerIP(char *str)
{
	char tmpStr[16];
	memset(tmpStr,0,16);
	CLaneInfo m_clsLane;
	m_clsLane.GetMessageIP(tmpStr);
	AdjustIP(tmpStr,str);
}

/*	获取图像服务器端口号:消息服务器端口号减2 */
int CNetBase::GetPictureServerPort()
{
	CLaneInfo m_clsLane;
	int PortNO=m_clsLane.MessagePort()-2;
	if(PortNO<1024){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"图象服务器端口号设置错误,用缺省端口6766\n");
		return 6766;
	}
	return PortNO;
}

/*	获取图象服务器IP地址 */
void CNetBase::GetPictureServerIP(char *str)
{
	char tmpStr[16];
	memset(tmpStr,0,16);
	CLaneInfo m_clsLane;
	m_clsLane.GetPictureIP(tmpStr);
	AdjustIP(tmpStr,str);
}

/*	将车道参数中的IP地址调整为系统能接受的格式 */
void CNetBase::AdjustIP(char *SrcIP,char *ObjIP)
{
	//从CLaneParam类中获得的IP地址的格式为"xxx.xxx.xxx.xxx",而实际发
	//送中若任意点前面的数字小于100,例如040或009等,要把前面的0去掉,
	//即IP地址为"008.202.099.020"在实际发送中要使用成"8.202.99.20"
	char tmpStr[4];
	memset(tmpStr,0,4);
	memmove(tmpStr,SrcIP,3);
	int Addr1=atoi(tmpStr);
	memset(tmpStr,0,4);
	memmove(tmpStr,SrcIP+4,3);
	int Addr2=atoi(tmpStr);
	memset(tmpStr,0,4);
	memmove(tmpStr,SrcIP+8,3);
	int Addr3=atoi(tmpStr);
	memset(tmpStr,0,4);
	memmove(tmpStr,SrcIP+12,3);
	int Addr4=atoi(tmpStr);
	sprintf(ObjIP,"%d.%d.%d.%d",Addr1,Addr2,Addr3,Addr4);
}

/*	调整发送文件指针 */
void CNetBase::AdjustSendPointer(char *IndexFile,char *DataFile)
{
/* 文件DataFile内容按行排列,每个要发送的文件名占一行;文件IndexFile
   内容共有三行,第一行为DataFile文件的总长度,第二行为当前要发送的文
   件名在DataFile文件中的位置,第三行是下一个要发送的文件名在DataFile
   文件中的位置。每次向DataFile中写入一个文件名后要改写IndexFile中记录
   的DataFile的总长度;每从DataFile中读取一个文件名准备发送时要改写
   IndexFile中记录的写一个要发送文件名在DataFile文件中的位置;每成功发
   送一个完整图片后要改写IndexFile文件中记录的当前要发送文件在DataFile
   中的位置(当前位置等于下一个要发送的位置),同时当前位置和总数量比较,
   若大于或等于,则删除文件IndexFile和DataFile(本函数完成该功能)	*/

   /*文件IndexFile"的定义如下:
		第一行:DataFile文件的字节总数 lTotalPoint
		第二行:下次文件发送的指针		lNextPoint
		第三行:当前文件发送的指针		lCurrentPoint
	
	bPointEquFlag标志的取值:当lCurrentPoint=lNextPoint时,为TRUE
	不等时为FALSE。当TRUE时,直接去发送DataFile文件,为FALSE时,把
	lNextPoint赋值给lCurrentPoint.*/

	if(bPointEquFlag) return;			//直接去发送
	try{
	FILE *fp1;
	if((fp1=fopen(IndexFile,"r"))==NULL) return;
	bPointEquFlag=TRUE;
	char tmpStr[12];
	memset(tmpStr,0,12);
	fgets(tmpStr,10,fp1);
	unsigned long TotalPoint=atol(tmpStr);
	memset(tmpStr,0,12);
	fgets(tmpStr,10,fp1);
	unsigned long NextPoint=atol(tmpStr);
	unsigned long CurrentPoint=NextPoint;	//NextPoint赋值给CurrrentPoint
	fclose(fp1);
	if(CurrentPoint>=TotalPoint){			//若数据发送完毕,删除两个文件
		remove(DataFile);
		remove(IndexFile);
	} else {
		if((fp1=fopen(IndexFile,"w"))!=NULL){
			fprintf(fp1,"%ld\n",TotalPoint);
			fprintf(fp1,"%ld\n",NextPoint);
			fprintf(fp1,"%ld\n",CurrentPoint);
			fclose(fp1);
		} else {
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新文件IndexFile失败(AdjustSendPointer)\n");
		}
	}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CNetBase::AdjustSendPointer()出现异常\n");
	}
}

CNetBase::ProcessReceiveData(unsigned char *pChData, int nDataLen)
{

}

/*	通知对方本机无数据要发送 */
void CNetBase::TransmitRR()
{
	unsigned char uChMessageType=(uChLocalReceiveIndex<<5)+1;
	//以当前接收序号响应服务器的I消息,RR消息的末位必须是1
	SendPackage(uChMessageType,"",0);
}

CNetBase::ResponseRR(unsigned char MessageType)
{

}

CNetBase::ResponseCMDR()
{

}

/*	复位发送/接收窗口和发送数据指针 */
void CNetBase::ResetProcess(char *IndexFile,char *DataFile)
{
	uChLocalSendIndex=0;				//发送计数器清零
	uChLocalReceiveIndex=0;				//接收计数器清零
	bPointEquFlag=TRUE;
	try{
	FILE *fp1,*fp2;
	if(((fp1=fopen(DataFile,"r"))!=NULL)&&((fp2=fopen(IndexFile,"r"))!=NULL)){
		fclose(fp1);
		char tmpStr[12];
		memset(tmpStr,0,12);
		fgets(tmpStr,10,fp2);			//读取总指针
		unsigned long TotalPoint=atol(tmpStr);
		fgets(tmpStr,10,fp2);			//读取下次要发送的指针
		memset(tmpStr,0,12);
		fgets(tmpStr,10,fp2);			//读取当前指针
		unsigned long CurrentPoint=atol(tmpStr);
		fclose(fp2);
		if((fp2=fopen(IndexFile,"w"))!=NULL){
			fprintf(fp2,"%ld\n",TotalPoint);	//将总指针存第一行
			fprintf(fp2,"%ld\n",CurrentPoint);	//将第三行的CurrentPoint和第二行的NextPoint相等
			fprintf(fp2,"%ld\n",CurrentPoint);
			fclose(fp2);
		} else {
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新文件IndexFile失败(ResetProcess)\n");
		}
	} else {
		remove(DataFile);
		remove(IndexFile);
	}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CNetBase::ResetProcess()出现异常\n");
	}
}

/*	将要发送的数据打包:增加车道地址、计算校验和等 */
void CNetBase::SendPackage(unsigned char uChMessageType, char *pChData, int nDataLen)
{
	unsigned char tmpStr[FRAME_LEN];
	memset(tmpStr,0,FRAME_LEN);
	tmpStr[0]=0xfd;
	tmpStr[1]=GetLaneAddr()/10+0x30;
	tmpStr[2]=GetLaneAddr()%10+0x30;
	tmpStr[3]=uChMessageType;
	int i;
	if(nDataLen!=0){
		memmove(tmpStr+4,pChData,nDataLen);
	}
	unsigned short CheckSum=0;
	for(i=0;i<nDataLen+4;i++)
		CheckSum=UpDateCRC(CheckSum,tmpStr[i]);
	tmpStr[nDataLen+4]=((CheckSum&0xf000)>>12)+0x30;
	tmpStr[nDataLen+5]=((CheckSum&0xf00)>>8)+0x30;
	tmpStr[nDataLen+6]=((CheckSum&0xf0)>>4)+0x30;
	tmpStr[nDataLen+7]=(CheckSum&0xf)+0x30;
	tmpStr[nDataLen+8]=0xfe;
	NetSend(tmpStr,nDataLen+9);
}

CNetBase::ReceiveError(unsigned char uChMessageType)
{

}

CNetBase::NetSend(unsigned char *pChData, int nDataLen)
{

}

CNetBase::SendSaveData()
{

}

CNetBase::SaveSendData(unsigned char *pChData, int nDataLen)
{

}

//	获取是否允许使用RAM盘
BOOL CNetBase::RAM_Flag()
{
	CLaneInfo m_clsLane;
	return m_clsLane.RAM_Disk();
}

⌨️ 快捷键说明

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