C++ 开发P2P及时消息发送程序(1)

C++ 开发P2P及时消息发送程序(1)

徐龙 2007-12-11

辞职有两个月了,还没有找到合适的工作. 郁闷.....
最近一段时间面试了几家公司,都觉得不是很合适,既没有学习价值,也没有认可的薪资,更别说能帮我打造就业机能力了。
闲着也是闲着,几年前就想做一个类似QQ的及时通讯工具了,就是没时间,现在不就是天时地利加人和了吗?
不可浪费上天给予的机会,开工吧。
首先选开发语言,C++ 吧,为什么?因为以前学习它都停留在书本上,太少实践了。

今天就先定制一下传输协议吧:
// 数据包类型
typedef enum packet_type   //:char
{
 INVALID=0,
 EMPTY=4,
 

 //与服务器连接
 P2S_SYN_CONN_REQ=8,
 S2P_ACK_CONN_REQ=12,
 P2S_FIN_CONN_REQ=16,


 //从服务器获得连接的初始信息
 P2S_SYN_INIDATA_REQ=20,
 S2P_ACK_INIDATA_REQ=24,
 S2P_FIN_INIDATA_REQ=28,


 // 客户端登陆消息
 P2S_SYN_LOGIN_REQ=32,     // 客户端向服务器发送登陆请求
 S2P_ACK_LOGIN_REQ=36,     // 服务器应答客户端登陆请求被收到,并回答登陆信息。
 P2S_FIN_LOGIN_REQ=40,      // 客户端收到 S2P_ACK_LOGIN_REQ 后, 回复 服务器

 //服务器客户端保持连线消息
 S2P_SYN_KEEPLIVE=44,       // 服务器发送保持连线
 P2S_ACK_KEEPLIVE=48,       // 客户端回复保持连线

 

 //相互交换数据信息
 PS_SYN_DATA_REQ=52,  // ps 发送数据请求(包含数据大小,封包大小,数据完整性标识号,和序号)
 PS_ACK_DATA_REQ=56,        // ps 回答收到数据发送请求,并设定封包大小等(数据完整性标识号,和序号)
 PS_FIN_DATA_REQ=60,        // ps 最终确定传输请求达成的协定(数据完整性标识号,和序号)

 PS_SYN_DATA=64,      // ps 发送数据(数据完整性标识号,和序号)
 PS_ACK_DATA=68,      // ps 回答收到数据(数据完整性标识号,和序号)
 PS_FIN_DATA=72,            // ps 数据发送完毕(数据完整性标识号,和序号)

 

 //客户端申请与另一客户端p2p消息
 P2S_SYN_HOLE_REQ=76,  // "提交连接客户端"向服务器注册 "要与另一客户端建立连接" 申请

 S2P_SYN_HOLE_REQ=80,  // 服务器向被动端,发送包,叫它准备好和别人连接.
 P2S_ACK_HOLE_REQ=84,  // 被动端回答服务器是否准备好了。

 S2P_ACK_HOLE_REQ=88,  // 服务器回答客户端收到申请(回答包含被请连接端相关连接信息)
 P2S_FIN_HOLE_REQ=92,       // 收到服务器对申请的回答.

 //客户端相互交换数据信息
 PP_SYN_DATA_REQ=96,  // pp 发送数据请求(包含数据大小,数据完整性标识号,和序号)
 PP_ACK_DATA=100,      // pp 回答收到数据(数据完整性标识号,和序号)
 PP_FIN_DATA=104,            // pp 数据发送完毕(数据完整性标识号,和序号)

 //客户端与客户端保持连线消息
 P2P_SYN_KEEPLIVE=108,       //
 P2P_ACK_KEEPLIVE=112,       //

 

} PACKET_TYPE;

typedef struct empty_pkt
{
 empty_pkt():ePacketType(EMPTY),dwPacketSize(0),dwSeqNumber(0),dwAckNumber(0)
 { }
 PACKET_TYPE  ePacketType;          //包类型
 DWORD   dwPacketSize;         //包大小
 DWORD   dwSeqNumber;    //包序号
 DWORD   dwAckNumber;    //包确认序号

}PACKET_HEADER;


typedef struct p2s_syn_conn_req_pkt:PACKET_HEADER
{
 
 p2s_syn_conn_req_pkt()
 {
  ePacketType=P2S_SYN_LOGIN_REQ;
 }

}P2S_SYN_CONN_REQ_PKT;

 

 

 

 

 

#endif

 

 

此过程中碰到一问题,C++ 枚举定义出来的元素大小默认是四个字节的,我想让他只暂一个字节,经过几翻
试验可以如下定义:
typedef   enum  eTest:char
{
     E1;
     E2;
}

可是当我用他作为类型定义了一个 struct 后,经测试它在分配空间时还是以四个字节分配的,又经过几翻
试验查找,原来 VC2005 它对结构体有一个特殊设置,就是字节对齐问题。32位系统下(我用的是w2k),它默
认是按四字节对齐的,也就是说当你的结构体大小不到四的倍数的话,编译器会自动给你补齐。既然如此那就
用它默认设置好了(可以设置成按1字节对齐),简单就是好吗,,干脆把上面的枚举也改回默认算了。。。

(未完。。。。。待续)

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxgnolux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值