C++ 開發P2P及時訊息發送程式(1)

來源:互聯網
上載者:User

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

(未完。。。。。待續)

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.