C 和 C 結構體Socket通訊

2022-08-02 20:21:11 字數 1533 閱讀 9427

最近在用c#做乙個專案的時候,socket傳送訊息的時候遇到了服務端需要接收c++結構體的二進位制資料流,這個時候就需要用c#仿照c++的結構體做出乙個結構來,然後將其轉換成二進位製流進行傳送,之後將響應訊息的二進位制資料流轉換成c#結構。

1、仿照c++結構體寫出c#的結構來

using system.runtime.interopservices;

[serializable] // 指示可序列化

[structlayout(layoutkind.sequential, pack = 1)] // 按1位元組對齊

public struct operator

}2、注意c#與c++資料型別的對應關係

c++與c#的資料型別對應關係表

api資料型別

型別描述

c#型別

api資料型別

型別描述

c#型別

word

16位無符號整數

ushort

char

字元char

long

32位無符號整數

intdwordlong

64位長整數

long

dword

32位無符號整數

uint

hdc裝置描述表控制代碼

inthandle

控制代碼,32位整數

inthgdiobj

gdi物件控制代碼

intuint

32位無符號整數

uint

hinstance

例項控制代碼

intbool

32位布林型整數

bool

hwm視窗控制代碼

intlpstr

指向字元的32位指標

string

hparam

32位訊息引數

intlpcstr

指向常字元的32位指標

string

lparam

32位訊息引數

intbyte

位元組byte

wparam

32位訊息引數

int整個結構的位元組數是22bytes。

對應的c++結構體是:

typedef struct

operator;

3、傳送的時候先要把結構轉換成位元組陣列

using system.runtime.interopservices; 

///

/// 將結構轉換為位元組陣列

///

/// 結構物件

/// 位元組陣列

public byte structtobytes(object obj)

{//得到結構體的大小

int size = marshal.sizeof(obj);

//建立byte陣列

byte bytes = new byte[size];

//分配結構體大小的記憶體空間

intptr structptr = marshal.allochglobal(size);

C 和 C 結構體Socket通訊

最近在用c 做乙個專案的時候,socket傳送訊息的時候遇到了服務端需要接收c 結構體的二進位制資料流,這個時候就需要用c 仿照c 的結構體做出乙個結構來,然後將其轉換成二進位製流進行傳送,之後將響應訊息的二進位制資料流轉換成c 結構。1 仿照c 結構體寫出c 的結構來 using system.r...

socket通訊傳送結構體

socket通訊可以直接傳送結構體!示例 傳送端 c sharp view plain copy struct student struct student student1 接受端 c sharp view plain copy struct student struct student stud...

C 通訊,結構體和byte陣列互轉

在c 進行udp或者tcp ip通訊時,經常要用到byte陣列來傳遞資訊。一開始,我是使用bitconverter和encoding來進行轉換。後來經過大神指導,其實一切不必那麼麻煩。只需將要傳送的資訊封裝成結構體,使用c 自帶的乙個轉換類便可輕鬆搞定。首先建立乙個結構體 必須引用的庫using s...