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