18,356
社区成员
发帖
与我相关
我的任务
分享
const enum
{
MT_JION = 1, // 一个用户加入
MT_LEAVE, // 一个用户离开
MT_MESG, // 一个用户发送消息
// 内部使用,告诉新加入的用户自己的用户信息
MT_MINE
};
typedef struct gt_hdr
{
u_char gt_type; // 消息类型
DWORD dwAddr; // 发送此消息的用户的IP地址
char szUser[15]; // 发送此消息的用户的用户名
int nDataLength; // 后面数据的长度
char *data() { return (char*)(this + 1); }//這裡是什麽意思呢?
} GT_HDR;
int CGroupTalk::SendText(char *szText, int nLen, DWORD dwRemoteAddr)
{
// 构建消息封包
char buf[sizeof(GT_HDR) + 1024] = { 0 };
GT_HDR *pHeader = (GT_HDR *)buf;
pHeader->gt_type = MT_MESG;
pHeader->nDataLength = nLen < 1024 ? nLen : 1024;
strncpy(pHeader->szUser, m_szUser, 15);
strncpy(pHeader->data(), szText, pHeader->nDataLength);
//這裡如何理解?
// 发送此封包
int nSends = Send(buf, pHeader->nDataLength + sizeof(GT_HDR), dwRemoteAddr == 0 ? m_dwMultiAddr : dwRemoteAddr);
return nSends - sizeof(GT_HDR);
}
struct x {
int a;
int b;
int c;
};
int main() {
x* a = new x;
cout << hex;
cout << (DWORD)a << endl; // 输出 xxx
cout << (DWORD)(a+1) << endl; // 输出 xxx+12 == xxx+sizeof(x)
}
结论: 指针+1 就是指针地址+sizeof(结构体大小)
typedef struct gt_hdr
{
....
char *data() { return (char*)(this + 1); }//this是指针,所以this+1 == this+sizeof(GT_HDR),跳过当前结构体,指向下面那个1024的开始处
} GT_HDR;