//Msg.h
#pragma once
#include <windows.h>
#pragma comment(lib,"Ws2_32.lib")
//********************************************************************
//Part1:消息结构体定义
//取结构体某个字段的偏移量
//思路:将址址0x00000000开始的地址看作是TYPE结构体对象
//然后再取出指定的字段的地址,即是偏移量
#define OFFSET(Struct, Member) ((size_t) &((Struct*)0)->Member)
#define CMD_LOGIN_REQUEST 0X10 //客户端请求登录
#define CMD_LOGIN_RESPONSE 0X20//服务器反馈登录
#define CMD_MSG_TO_SERVER 0X30//客户端上传聊天信息
#define CMD_MSG_TO_CLIENT 0X40//服务器分发聊天信息
#define CMD_LINK_CHECK 0X50//服务器隔一段时间进行链路检测
typedef struct SMsgHdr{//数据包头部,所有的数据包都以 SMsgHdr 开头
int iCmdType;//命令ID
int iPkgLen;//整个数据包长度 = 数据包头部 + 数据包体
}SMSGHDR, *PSMSGHDR;
typedef struct SMsgLogin{//登录数据包(客户端->服务器端)
TCHAR szUser[32];//用户名
TCHAR szPwd[32];//账号
}SMSGLOGIN, *PSMSGLOGIN;
typedef struct SMsgResp{//登录回应数据包(服务器端->客户端)
int iResult;//登录结构:1=成功,0=用户名或密码错误
}SMSGRESP, *PSMSGRESP;
typedef struct SMsg2Server{//聊天语句(客户端->服务器端):不等长数据包
int iContent;//后面内容字段的长度
TCHAR szContent[256];//内容,长度由iContent指定
}SMSG2SERVER, *PSMSG2SERVER;
typedef struct SMsg2Client{//聊天语句(服务器端->客户端):不等长数据包
int iContent;//后面内容字段的长度
TCHAR szSender[32];//消息发送者
TCHAR szContent[256];//内容,不等长,长度由nLength指定
}SMSG2CLIENT, *PSMSG2CLIENT;
typedef struct SMsgPkg{//数据包定义方式:每个数据包以MSGHEAD + MSGXXX组成
SMSGHDR stMsgHdr;//Msg Head
union{
SMSGLOGIN stMsgLogin;
SMSGRESP stMsgResp;
SMSG2SERVER stMsg2Server;
SMSG2CLIENT stMsg2Client;
};//Msg Body
}SMSGPKG, *PSMSGPKG;
//***********************************************************************************
//Part2:消息队列设计(先进先出)
#include <strsafe.h>

本文详细探讨了TCP聊天室中通信协议数据包的设计,通过Msg.h和Msg.cpp文件的实现,阐述了如何确保消息的正确传输与解析,以实现稳定可靠的网络通信。
最低0.47元/天 解锁文章
711

被折叠的 条评论
为什么被折叠?



