c# 用socket tcp接收收據,如何去判斷接收資料的長度
uj5u.com熱心網友回復:
如果是分包發送的話,第一個包應該整包的長度資訊的,這個看你怎么設計傳輸協議uj5u.com熱心網友回復:
或者是類似命令列協議,帶終止符的uj5u.com熱心網友回復:
分包的情況下 你收到的byte [] 是多長 那么就是多長..判斷沒有意義..所以你得設計你自己的通訊協議. 包含頭尾長度功能校驗這些..
而不是單純的從"長度"去下手
uj5u.com熱心網友回復:
為什么要判斷長度?如果你是怕包丟失的話,那么你在寫程式發包的時候就可以進行定義,比如說你要發的包原本是字串型別,長度是25,那么你可以在發包的時候將字串在前面增加欄位變成,25|str,其中25是字串長度,|是分隔符,自己隨便定義,str是本身的字串,然后收到資料后將其轉化成string,用分隔符分開成a[0],a[1],然后判斷a[1].length是否等于Integer.Parse(a[0])。如果你是在單純想知道接收資料后存到byte陣列的長度,用length就行了啊,byte還不是陣列。uj5u.com熱心網友回復:
Socket.Receive();https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.receive?redirectedfrom=MSDN&view=netframework-4.8
方法的回傳值,就是實際接收到的位元組數。
uj5u.com熱心網友回復:
這種 TCP Socket 的坑總是填不完!注意:TCP Socket 并沒有定義“如何收完對方發來的資料包”,這種判斷必須由業務層自己解決!由于TCP 存在粘包、分包問題,難以一次收完所有發過來的包,比較簡單的方法是在發送的資料包前面加上一個頭(比如8位元組),在頭資訊里填寫后續資料長度。收包時先收包頭(直到收夠8位元組),算出后續長度,再回圈收,累計收到的位元組數達到包頭中定義的長度,才算收完。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/92015.html
標籤:C#
