//父类有多个子类,子类强制转换为父类,根据子类在父类中的共有信息确定
//被强制转换的是哪个子类
#pragma once
#include<iostream>
#include<fstream>
using namespace std;
const int nBuffSize=1024;
#define MAX_FILE_DIR_LENGTH 256
//各种消息的宏定义
#define INVALID_MESSAGE -1 //无效的消息
#define MSG_FILE_NAME 1 //表示收发的是文件名
#define MSG_FILE_LENGTH 2 //表示收发的是文件长度
class CCMsg
{
public:
struct TMsgParent //父消息
{
int msgID;
TMsgParent(int msg=INVALID_MESSAGE):msgID(msg){} //重点信息********************************
};
struct TMsgFileName:public TMsgParent //文件名数据包
{
char fileName[MAX_FILE_DIR_LENGTH];
TMsgFileName():TMsgParent(MSG_FILE_NAME){} //重点信息**********************
};
struct TMsgFileLength:public TMsgParent //文件大小数据包
{
long fileLength;
TMsgFileLength():TMsgParent(MSG_FILE_LENGTH){}
};
};
//----------------------------------------------------------------------
//利用socket传输一个TMSG_FILELENGTH类型的结构体
CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength);
::send(sClient, (char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0);
//---------------------------------------------------------------------
// 将传输来的信息强制转换为父结构体,根据父结构体的标识符来识别传输来的是哪个子结构体
CCSDef::TMSG_HEADER *pMsgHeader; //重点信息******************************
int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);
pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;
switch (pMsgHeader->cMsgID) //重点信息*******************************
{
case MSG_FILELENGTH: // 文件的长度
{
if (0 == g_lLength)
{
g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength;
printf("File Length: %d
", g_lLength);
}
}
break;
case MSG_FILENAME: // 文件名
{
return AllocateMemoryForFile(pMsgHeader);
}
break;
}