這個網絡協議如何理解啊?

haolly 2013-06-10 07:08:25
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);
}
...全文
63 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
haolly 2013-06-11
  • 打赏
  • 举报
回复
引用 1 楼 aj3423 的回复:
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;
谢谢了
aj3423 2013-06-10
  • 打赏
  • 举报
回复
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;
    尽管讲解概念如果同学们是初初相识,真有点晦涩难懂,本人讲解概念的同时,尽量结合实操来讲,这样即加固了概念,同时让同学不会感觉到太烦闷,其实对这些重要基础概念的理解,正是学习过《计算机网络原理》,与直接上手做事的人的区别所在。     古人云,腹有诗书气自华,只要先搞懂了原理,学有所成,今后和别人讨论网络底层问题的时候,才能够抑扬顿挫底气十足,不怯场!# 网络层首部     初探十二段内容介绍     ipv4和ipv6 版本号表示;首部长度     区分服务,给数据包添加标识 QoS     总长度 Total Length;标识Identification;标志Flags     生存时间 TTL     协议号;首部校验和     实训抓包验证诸项内容# ICMP 差错报告报文格式     数据包类型(详解列表:类型值和代码)     TTL耗尽报告-1     主机不可到达(Destination unreachable)-2     路由重定向(Redirect)-3     给应用程序返回差错报告-4     实例讲解:使用ping命令测试网络判断出问题范围     跟踪数据包路径主要命令介绍:tracert和pathping# ARP 协议     arp 协议本网段与跨网段的工作原理     arp 欺骗的两个目的,阻断连接或截获数据包     arp 欺骗的工作原理阐述,创建阻断连接的实验环境     arp 欺骗演示工具,网络执法官     arp 欺骗防止或阻止措施:         手工绑定两端通信主机的mac地址 -a         同时修改mac地址和ip地址;安装运行wireshark工具 -b         在路由器中绑定通信主机mac地址 -c# 搭建流媒体服务     提供点对点服务:采用TCP协议,而非IGMP协议     提供多播视频:根据多播地址切换频道(IGMP协议-UDP)     根据多播IP地址,参照预定规则,合成多播MAC地址     阐述IGMP跨网段运行方式,与创建跨网段环境     启用多播路由:实现流媒体跨网段转发视频,同时抓包查看ICMP数据包特性# 习题详解    网络层协议

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧