程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C與C# socket 跨平台通訊傳輸結構體,

C與C# socket 跨平台通訊傳輸結構體,

編輯:C#入門知識

C與C# socket 跨平台通訊傳輸結構體,


最近需要寫一個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#端解析成功。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved