公司專案曾涉及與linux系統通訊的程式,參考了些例子實現了,現在寫下了,做個記錄供以後查閱,廢話不說了,現在開始......
首先定義c#裡的結構體:
using system.runtime.interopservices;[serializable] // 指示可序列化
[structlayout(layoutkind.sequential, pack = 1)] // 按1位元組對齊
public struct mystruct
set}
public string password
set}
}
注意set
這行**,value的長度不足20(上面宣告的大小:[marshalas(unmanagedtype.byvalarray, sizeconst = 20)] ),要在其後補'\0'.
接下來,是重點就是將上面的結構體轉換成linux系統可識別的byte陣列:
using system.runtime.interopservices;/// /// 將結構轉換為位元組陣列
///
/// 結構物件
/// 位元組陣列
public byte structtobytes(object obj)
/// /// byte陣列轉結構
///
/// byte陣列
/// 結構型別
/// 轉換後的結構
public object bytestostruct(byte bytes, type type)
//分配結構大小的記憶體空間
intptr structptr = marshal.allochglobal(size);
//將byte陣列拷到分配好的記憶體空間
marshal.copy(bytes, 0, structptr, size);
//將記憶體空間轉換為目標結構
object obj = marshal.ptrtostructure(structptr, type);
//釋放記憶體空間
marshal.freehglobal(structptr);
//返回結構
return obj;
}
現在就看看如何將結構體發生給linux端:
mystruct mystruct=new mystruct();mystruct.id=1;
mystruct.name="karl";
mystruct.password="123456";
byte senddata=structtobytes(mystruct);
tcpclient client= new tcpclient((ip,port);
);networkstream ns = client.getstream();
ns.write(senddata,0,senddata.length); // 傳送
ns.flush();
client.close();
linux端也要定義乙個對應的結構體:
typedef struct mystructmystructtype;
接下來linux端怎麼接收byte陣列轉換出結構就不講了,因為本人只寫過一年的微控制器程式,也不熟悉linux端c**如何寫了。貌似有一點要注意的是定義的結構體的大小(位元組的總數)最好是8的倍數,好像linux端有位元組對齊的問題,曾試過定義的結構不為8的倍數時,linux端的結構大小和實際的不一致。
到此結束了,本人文筆水平有限,寫得有什麼不足的,樂意接受大家的建議批評。
C 和 C 結構體Socket通訊
最近在用c 做乙個專案的時候,socket傳送訊息的時候遇到了服務端需要接收c 結構體的二進位制資料流,這個時候就需要用c 仿照c 的結構體做出乙個結構來,然後將其轉換成二進位製流進行傳送,之後將響應訊息的二進位制資料流轉換成c 結構。1 仿照c 結構體寫出c 的結構來 using system.r...
C 和 C 結構體Socket通訊
最近在用c 做乙個專案的時候,socket傳送訊息的時候遇到了服務端需要接收c 結構體的二進位制資料流,這個時候就需要用c 仿照c 的結構體做出乙個結構來,然後將其轉換成二進位製流進行傳送,之後將響應訊息的二進位制資料流轉換成c 結構。1 仿照c 結構體寫出c 的結構來 using system.r...
C語言結構體與C 結構體之間的差異
在 c 語言中,我們不能在結構體內部定義成員變數。但在 c 中,結構體不僅可以擁有成員變數,還可以擁有成員方法。在 c 語言中,我們不能直接初始化結構體成員變數。但在 c 中可以這樣做。include struct record intmain 輸出 7 在 c 語言中,在定義結構體變數時,我們需要...