C 與linux的結構體通訊

2022-08-27 18:33:12 字數 1860 閱讀 8461

公司專案曾涉及與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 mystruct

mystructtype;

接下來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 語言中,在定義結構體變數時,我們需要...