C S架構即時聊天程式程式設計 通訊協議設計

2021-09-13 12:13:07 字數 2122 閱讀 9918

此次討論的協議是資料傳輸時遵照的一定格式。

乙個好的通訊協議,首先要囊括所有需要傳送的資訊,能適應各種傳送情況,不管你需要向服務端傳送一條訊息,還是需要驗證登入,都可以通過固定的協議格式傳送。在這個基礎上應該盡量精簡,減少打包傳送和解包讀取的工作量,減輕雙方的負擔。所以在設計協議之前我們需要討論都有可能傳送何種訊息,根據具體的需求確定具體的協議。此外在協議基礎上應留有一定的擴充套件空間,在未來有更多需求的時候可以依據此協議進行修改內容。

在聊天室例子中,只有兩種情況,客戶端發給服務端還有服務端發給客戶端。

服務端發給客戶端

分析完通訊種類我們不難得出一下幾種結論。

根據分析,我們將資料報處理成四段,分別包括:

字段空間

說明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模式...