QT Go TCP資料傳輸粘包問題

2021-08-19 10:47:09 字數 2259 閱讀 7478

使用go語言為伺服器,qt作為客戶端,利用tcp進行資料傳輸,當兩次傳送間隔過近會產生粘包現象,此時就需要乙個特定的資料格式用來區分兩個資料的邊界,我使用 特徵碼(int型別用來區分是否惡意)資料報大小(int)壓縮標誌(bool)資料(byte),但當互動時發生問題,比如qt的自定義資料格式qbytearry會在最前面加個字段用來表示自身整體大小。下面直接列出**:

go:

msglenbuf := tobytes(msglen, msg.littleendian)

msglenbuf := make(byte, unsafe.sizeof(int32(0)))

var msglen int32

//讀取len

if _, err := io.readfull(conn.conn, msglenbuf); err != nil

meslen1, err := frombyte(msglenbuf, int32(0), msg.littleendian)

if err != nil

msglen = meslen1.(int32)

func tobytes(n inte***ce{}, islittleendian bool) byte )

if !islittleendian else

return bytesbuffer.bytes()

}func frombyte(bytedara byte, item inte***ce{}, islittleendian bool) (inte***ce{}, error) else

return g, err

case uint64:

g := uint64(0)

if !islittleendian else

return g, err

case int:

g := int(0)

if !islittleendian else

return g, err

case int32:

g := int32(0)

if !islittleendian else

return g, err

case bool:

g := bool(false)

if !islittleendian else

return g, err

} return nil, fmt.errorf("unknow type %v", reflect.typeof(item))

}

上面兩個函式用於轉換,將int bool 轉成byte陣列

其實自己寫位運算也可以實現

var buffer bytes.buffer

size := inttobytes(int(9) + len(k))

feature := inttobytes(int(15))

iscompress := booltobyte(false)

data := byte(k)

buffer.write(size)

buffer.write(feature)

buffer.write(iscompress)

buffer.write(data)

conn.write(buffer.bytes())

先獲取總體大小int 為4位元組 bool為1位元組因此首先就是4*2+1=9個位元組,然後再加上資料大小最後就變為9+len(k)

再將size feature iscompress  data 傳送出去即可

qt c++:

int bytetoint(qbytearray data)

bool bytetobool(qbytearray data)

qbytearray booltobyte(bool i)else

return byte;

}qbytearray inttobyte(int i)

if(receive_data.size()>(sizeof(int)+sizeof(int)))

{bool iscompress;

int data_size;

int feature;

qbytearray data;

std::string k= receive_data.tostdstring();

qdebug()《接收資料後先看看夠不夠前面兩個資料,讀取特徵值與總資料報大小,看看資料報總體大小夠不夠,然後對其進行解析。

網路遊戲資料傳輸 粘包的處理

網路傳輸大體上包含這四個協議type area command message,這四層協議是依次向下傳遞的。所謂協議,說簡單點就是伺服器端和客戶端的乙個約定,比如,向伺服器傳送 1,0,1,賬號 密碼 約定type中1代表登入模組,因為登陸不需要經過area協議,所以跳過area協議,直接到comm...

C SFTP資料傳輸

我們有些客戶公司的資料比較重要,為了安全集團公司內部都使用的是區域網,但是有時候又不得不予外界網際網路做資料互動,所以有些不重要的系統是放在外界網際網路的,這樣以來內部系統和外部系統的資料互動就成為了問題,這樣以來就使用到了sftp伺服器來作為資料傳輸的中介。下面不說了,直接上c 此處使用了第三方動...

資料傳輸方式

資料傳輸方式 1 並行傳輸與序列傳輸 並行傳輸指的是資料以成組的方式,在多條並行通道上同時進行傳輸。常用的就是將構成一 個字元 的幾位二進位製碼,分別在幾個並行通道上進行傳輸。例如,採用8單位 的字 符 可以用8個通道並行傳輸。一次傳送乙個字元,因此收 發雙方不存在字元的同步問題,不需要另加 起 止...