此次討論的協議是資料傳輸時遵照的一定格式。
乙個好的通訊協議,首先要囊括所有需要傳送的資訊,能適應各種傳送情況,不管你需要向服務端傳送一條訊息,還是需要驗證登入,都可以通過固定的協議格式傳送。在這個基礎上應該盡量精簡,減少打包傳送和解包讀取的工作量,減輕雙方的負擔。所以在設計協議之前我們需要討論都有可能傳送何種訊息,根據具體的需求確定具體的協議。此外在協議基礎上應留有一定的擴充套件空間,在未來有更多需求的時候可以依據此協議進行修改內容。
在聊天室例子中,只有兩種情況,客戶端發給服務端還有服務端發給客戶端。
服務端發給客戶端
分析完通訊種類我們不難得出一下幾種結論。
根據分析,我們將資料報處理成四段,分別包括:
字段空間
說明type
4位元組包型別
sender
32位元組
傳送者id
recver
32位元組
接受者id
message
956位元組
自由空間
type指定包型別,接受者根據型別選擇不同的處理方式;sender指明包的**,recver指定包的接收方。message是一塊自由空間,根據包型別設定對應內容或者不設定。
每各字段有固定的空間範圍,這樣資料報的長度固定,方便傳送和接收,避免資料量大時發生黏包問題。
此時約定雙方傳送的格式,按照如下格式設定各欄位內容。
種類type
sender
recver
message
登入login
登入id
server
password
登入驗證
login
server
登入id
success/pass error/id error
註冊regis
註冊id
server
password
註冊驗證
regis
註冊id
server
success/rename id
傳送訊息
msg傳送id
接收id
訊息內容
**訊息
msg傳送id
接收id
訊息內容
收發雙方都應該按照如上格式設定協議包的各欄位,打包和解包資料。
我們可以使用乙個結構體儲存包的各個字段,方便解包和打包。在網路傳送時,send和recv函式傳送和接收的都是void *
的一塊無型別的空間,我們需要將有型別的資料處理成無型別的資料,傳送到對端後,再轉換成有型別的資料。
// package.c
// 型別
enum type
;// 訊息結構體,1024位元組大小
typedef
struct package
s_package;
typedef s_package *pt_package;
/** * pack是打包的結構體
* return傳送的內容
* */
void
*pack_msg
(pt_package pack)
/** * buf是收到的訊息
* 返回解包後的結構體指標
* */
pt_package get_package
(void
*buf)
/** * type是包型別
* send_name是傳送者姓名
* recv_name是接受者姓名
* msg是傳送的訊息
* 返回資料結構體
* ps.資料超過指定大小後會捨棄
* */
pt_package pack_package
(int type,
char
*send_name,
char
*recv_name,
char
*msg)
QT網路程式設計Tcp下C S架構的即時通訊
先寫乙個客戶端,實現簡單的,能加入聊天,以及加入伺服器的介面。ifndef tcpclient h define tcpclient h include include include include include include include include class tcpclient p...
網路程式設計 C S架構,TCP IP介紹
什麼是c s架構?c指的是client 客戶端軟體 s指的是server 服務端軟體 應用軟體如何執行?客戶端軟體想要基於網路傳送一條訊息給服務端軟體,流程是 1 客戶端軟體產生資料,存放於客戶端軟體的記憶體中,然後呼叫介面將自己記憶體中的資料傳送 拷貝給作業系統記憶體 2 客戶端作業系統收到資料後...
C語言網路程式設計 C S架構模板
進行socket程式設計的常用函式有 socket 建立乙個socket bind 用於繫結ip位址和埠號到socket connect 該函式用於繫結之後的client端與伺服器建立連線 listen 設定能處理的最大連線要求,listen 並未開始接收連線,只是設定socket為listen模式...