//父类有多个子类,子类强制转换为父类,根据子类在父类中的共有信息确定 //被强制转换的是哪个子类 #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; }