C TCP通訊以及報文格式和接收處理

2021-10-08 17:48:47 字數 1466 閱讀 5719

專案中用的就是demo中的部分**,連線上後,就是接收報文,處理報文,報文格式具體要和傳送端協商,我這裡的報文格式是這樣的。

一組報文格式如下:

1.乙個float,表示這組報文的總位元組數

2.乙個float,表示變數名的總位元組數

3.多個char,每乙個變數名

4.乙個float,表示資料的總位元組數

5.多個double,每乙個變數對應的數值

下面是解析一組報文的核心**:

//對data清零  

recvdata = new byte[1024];

//獲取收到的資料的長度

recvlen = clientsocket.receive(recvdata);

totallength = bitconverter.toint32(recvdata, index);//報文的總長

index += 4;

variablecount = bitconverter.toint32(recvdata, index);//變數名總位元組數

index += 4;

string c = encoding.ascii.getstring(recvdata, index, variablecount);//變數名

string arr = c.split('#');//變數名

index += variablecount;

this.inputntnormal = bitconverter.toint32(recvdata, index);

index += 4;

double a = bitconverter.todouble(recvdata, index);//每個變數名對應的double值

index += 8;

後來接收並儲存完資料後,顯示發現,由於網路不穩定,不一定會一次就正好發一組報文,有可能網路好,一次發了多個報文,有可能不好,發好幾次才發完一組報文,所以還要把接收的資料處理一下,這裡邏輯有點繞,多虧我同事的鼎力相助,不然沒寫過的我估計要想好久。 

接收報文,獲取該組報文的總長度,跟接收到的長度進行比較,接收了多組報文,先擷取第一組報文,處理完後,再判斷第二組報文是否接收完全,完全則處理,不完全則保留下來,再次迴圈接收下一次資料,把下次接收的資料追加到保留的資料後面,重新組成乙個完整的報文。

當時我模擬一次收到兩個半報文處理,但是始終跳不出思維怪圈,找不到規律 ,不知道怎麼用迴圈,最後還是同事幫助下,用乙個while迴圈,裡面乙個if,if條件不滿足就跳出while迴圈,while迴圈的條件是剩餘的資料長度大於報文的長度,就是後面有乙個完整的報文。跳出while迴圈則證明剩餘的已經不是乙個完整的報文了,需要在此接收資料,並且追加資料。

IP報文格式和例項分析

上面是ip的報文格式,接下來我們先說明各個欄位的意義。然後,用etheral軟體轉包分析ip的報文格式。1.版本 ip報文中,版本佔了4位,用來表示該協議採用的是那乙個版本的ip,相同版本的ip才能進行通訊。一般此處的值為4,表示ipv4。2.頭長度 該字段用四位表示,表示整個ip包頭的長度,其中數...

使用形式語言定義通訊報文格式

本文由 lonelyrains 在通訊過程中,有幾種常用的通訊報文定義格式。有if else直接層層遞進融合 的方式,有自然語言描述的方式定義一條條規則,但是很少發現有用形式語言定義的。其實,形式語言定義的報文,由於是規範,可以比較方便地讓計算機識別,從而自動轉換成 它和直接if else定義報文相...

HTTP請求報文格式 GET和POST

最近在做安卓客戶端上傳外掛程式功能,供後台呼叫。其中涉及到了拼接http請求報文,所以就對報文內容研究了一下,現在做個總結,備忘。自己使用fiddler抓取報文如下 post請求報文 此處省略二進位制等資料 7e21361611db0 包含4部分。1.第一行 請求行,說明請求型別和協議版本。http...