最近需要寫一個C組成的服務器端與C#的客戶端進行交互的軟件,剛開始寫的時候發現C#端解析時候出現了故障,經過仔細研究後發現原因是發送方傳輸太快,出現了所謂粘包的現象。也就是在C#端的Receive()。這個函數返回的是多個結構體連起來的數據,這當然是無法解析的。我的解決方案如下:
List<byte[]> listb = new List<byte[]>(); .......... int recv = newclient.Receive(b1); for (int x = 0; x < recv / 12; x++) { byte[] b2 = new byte[12]; int i=0; for (int lc = x * 12; lc < x * 12 + 12; lc++) { b2[i] = b1[lc]; i++; } listb.Add(b2); }
這樣一來就直接解析listb中的元素就可以了,直接
foreach(var i in listb) { ................ }
但是在之後的解析之中還是出現了問題,我的結構體元素中後半部分的數字不是我發送端傳送的,也不是亂碼。後來再仔細檢查發現,由於SERVER端是C寫的,CLIENT是C#寫的,兩邊是在不同的環境下。而C在聲明結構體的時候,會有所謂“內存對齊”的現象發生。這樣一來,在轉換的地方會有中間一部分二進制是由編譯器生成用來填充的數字。我的解決方案是在其中填充0字節(PS.終於知道為啥RIP啥的協議格式會如此詭異了)。填充完成後,結構體大小不變,C#端解析成功。