电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

C#和C++结构体Socket通信VIP免费

C#和C++结构体Socket通信_第1页
1/7
C#和C++结构体Socket通信_第2页
2/7
C#和C++结构体Socket通信_第3页
3/7
第1页共7页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共7页C#和C++结构体Socket通信最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应消息的二进制数据流转换成C#结构。1、仿照C++结构体写出C#的结构来usingSystem.Runtime.InteropServices;[Serializable]//指示可序列化[StructLayout(LayoutKind.Sequential,Pack=1)]//按1字节对齐publicstructOperator{publicushortid;//声明一个字符数组,大小为11[MarshalAs(UnmanagedType.ByValArray,SizeConst=11)]publicchar[]name;[MarshalAs(UnmanagedType.ByValArray,SizeConst=9)]publicchar[]pass;publicOperator(stringuser,stringpass)//初始化{this.id=10000;this.name=user.PadRight(11,'\0').ToCharArray();this.pass=pass.PadRight(9,'\0').ToCharArray();}}2、注意C#与C++数据类型的对应关系C++与C#的数据类型对应关系表API数据类型类型描述C#类型WORD16位无符号整数ushort第2页共7页第1页共7页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共7页CHAR字符charLONG32位无符号整数intDWORDLONG64位长整数longDWORD32位无符号整数uintHDC设备描述表句柄intHANDLE句柄,32位整数intHGDIOBJGDI对象句柄intUINT32位无符号整数uintHINSTANCE实例句柄intBOOL32位布尔型整数boolHWM窗口句柄intLPSTR指向字符的32位指针stringHPARAM32位消息参数intLPCSTR指向常字符的32位指针StringLPARAM32位消息参数intBYTE字节byteWPARAM32位消息参数int整个结构的字节数是22bytes。对应的C++结构体是:typedefstruct{WORDid;CHARname[11];CHARpassword[9];}Operator;3、发送的时候先要把结构转换成字节数组usingSystem.Runtime.InteropServices;第3页共7页第2页共7页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第3页共7页//////将结构转换为字节数组//////结构对象///字节数组publicbyte[]StructToBytes(objectobj){//得到结构体的大小intsize=Marshal.SizeOf(obj);//创建byte数组byte[]bytes=newbyte[size];//分配结构体大小的内存空间IntPtrstructPtr=Marshal.AllocHGlobal(size);//将结构体拷到分配好的内存空间Marshal.StructureToPtr(obj,structPtr,false);//从内存空间拷到byte数组Marshal.Copy(structPtr,bytes,0,size);//释放内存空间Marshal.FreeHGlobal(structPtr);//返回byte数组returnbytes;}接收的时候需要把字节数组转换成结构//////byte数组转结构//////byte数组///结构类型//转换后的结构publicobjectBytesToStruct(byte[]bytes,Typetype)第4页共7页第3页共7页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第4页共7页{//得到结构的大小intsize=Marshal.SizeOf(type);Log(size.ToString(),1);//byte数组长度小于结构的大小if(size>bytes.Length){//返回空returnnull;}//分配结构大小的内存空间IntPtrstructPtr=Marshal.AllocHGlobal(size);//将byte数组拷到分配好的内存空间Marshal.Copy(bytes,0,structPtr,size);//将内存空间转换为目标结构objectobj=Marshal.PtrToStructure(structPtr,type);//释放内存空间Marshal.FreeHGlobal(structPtr);//返回结构returnobj;}4、实际操作:usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Net;usingSystem.Net.Sockets;byte[]Message=StructToBytes(newOperator("user","pass"));//将结构转换成字节数组TcpClientsocket=newTcpClient();第5页共7页第4页共7页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第5页共7页socket.Connect(ip,port);NetworkStreamns=Socket.GetStream();ns.Write(Message,0,Message.Length);//发送byte[]Recv=newbyte[1024];//...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

C#和C++结构体Socket通信

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部