c socket通訊,定義訊息體長度同步接收資料

2022-01-11 06:33:37 字數 2356 閱讀 2674

因為沒有檔案上傳,沒有大的位元組傳輸,資料過來就放到佇列,所以沒有用非同步,使用同步方式接收資料。

原理:1.前面四個位元組是訊息頭,存放訊息體長度;

2.後面位元組定義訊息體;

3.服務端收到訊息後,先獲取訊息頭部,如果不夠繼續接收;如果夠了則根據頭部計算出訊息體長度;

4.根據訊息頭標記的長度獲取訊息體,如果不夠,繼續接收;如果夠了或者有多餘,重新獲取訊息頭部,不停的迴圈;

private

void receive(socket socket, string

ip) ,socket已斷開,停止接收資料;");

break

; }

byte prevbytes = new

byte[1024];//

單次最多可接收的位元組

int len =socket.receive(prevbytes, prevbytes.length, socketflags.none);

var bytes = prevbytes.take(len).toarray();//

實際接收的位元組

this

.rcvheaddata(pack, bytes);

}catch

(exception ex)

,接收socket資料異常,message:,stacktrace:;");}}

});}

///

///接收訊息頭

/// ///

///private

void rcvheaddata(bytepkg pack, byte

bytes);}

else

//★★★★★開始處理訊息體部分★★★★★

var bodylen = len;//

身體長度

if (skipheadlen > 0

)

this

.rcvbodydata(pack, bytes.skip(skipheadlen).take(bodylen).toarray());}}

//////

接收訊息體

/// ///

///private

void rcvbodydata(bytepkg pack, byte

bytes);}

else

//處理接收到的資料

netmsg msg = bytehelper.deserialize(pack.bodybuff);

this

.onreceivemsg(msg);

//重置訊息包

pack.resetdata();

//★★★★★開始處理訊息頭部分★★★★★

this

.rcvheaddata(pack, bytes.skip(skipbodylen).toarray());

}}

///

///訊息接收類

/// public

class

bytepkg

public

void

initbodybuff()

public

void

resetdata()

}

///

///位元組輔助類

/// public

class

bytehelper

public

static

byte packleninfo(byte

data)

public

static

byte serialize(t pkg) where

t : netmsg

}public

static t deserialize(byte bs) where

t : netmsg

}}

///

///自定義請求資料格式

///[serializable]

public

class

netmsg

1.客戶端:先將實體序列化,轉為位元組陣列,然後同步傳送即可,無需非同步傳送

2.服務端:

先想辦法獲取訊息頭

如果訊息頭一直沒滿,那就一直獲取

如果訊息頭滿了,就計算出訊息體長度,並向下獲取訊息體

再想辦法獲取訊息體

根據訊息頭包含的訊息體長度,獲取訊息體

如果訊息體一直沒滿,那就一直獲取

如果訊息體滿了,那就重新獲取訊息頭

C Socket通訊例子

建立兩個工程檔案,server和client include include pragma comment lib,ws2 32.lib 靜態加入乙個lib檔案 pragma warning disable 4996 using namespace std intmain 繫結ip和埠 配置監聽位址...

C socket同步通訊

源博主鏈結 關於c socket通訊,分為同步和非同步通訊,本文簡單介紹一下同步通訊。通訊兩端分別為客戶端 client 和伺服器 server 1 建立乙個socket對像 2 用socket對像的connect 方法以上面建立的endpoint對像做為引數,向伺服器發出連線請求 3 如果連線成功...

C Socket非同步通訊

由於平時使用unity開發,所以相對其他的程式語言,對c 比較了解,所以寫了乙個c s的socket非同步通訊程式。目前只是在c 中測試,未來會接入unity3d,這個只是我個人用來進行學習用的,所以大家不必在意使用哪個語言做後端伺服器開發更好 一些說明 1.伺服器連線池 class conn 初始...