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位元組對齊),簡單就是好嗎,,乾脆把上面的枚舉也改回預設算了。。。
(未完。。。。。待續)