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字节对齐),简单就是好吗,,干脆把上面的枚举也改回默认算了。。。
(未完。。。。。待续)