您的位置:首页 > 编程语言 > C语言/C++

C#与C++通过socket传送结构体

2016-10-05 20:04 316 查看
C#服务端:

 1

using System;
 2

using System.Net.Sockets;
 3

using System.Net;
 4

using System.IO;
 5

using System.Diagnostics;
 6

using System.Threading;
 7

using System.Runtime.InteropServices;
 8


 9


10




















11


12


13

[StructLayout(LayoutKind.Sequential, Pack = 1)]
14

        public struct PaketHead
15

        {
16

            public UInt32 OPCode;
17

            public byte DiskFlag;
18

            public long DiskSize;
19

            public long OPOffSet;
20

            public long OPByteCount;
21


22

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
23

            public byte[] Authentic;
24

            public byte Encrypt;
25

            public byte Ver;
26

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
27

            public byte[] AddIn;
28

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
29

            public byte[] Reserve;
30

            public byte Zero;
31

            public int SizeOfHead;
32

        }
33


34

        protected byte[] Struct2Bytes<T>(T obj)
35

        {
36

            int size = Marshal.SizeOf(obj);
37

            byte[] bytes = new byte[size];
38

            IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
39

            Marshal.StructureToPtr(obj, arrPtr, true);
40

            return bytes;
41

        }
42


43

        protected T Bytes2Struct<T>(byte[] bytes)
44

        {
45

            IntPtr arrPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0);
46

            return (T)Marshal.PtrToStructure(arrPtr, typeof(T));
47

        } 
48


49

        protected void ReadPacketHead(BinaryReader ClientReader, BinaryWriter ClientWriter)
50

        {
51

            byte[] test = null;
52

            test = ClientReader.ReadBytes(180);
53


54

            PaketHead Paket = Bytes2Struct<PaketHead>(test);
55


56

            Console.WriteLine(Paket.OPCode);
57

            Console.WriteLine(Paket.DiskFlag);
58

            Console.WriteLine(Paket.DiskSize);
59

            Console.WriteLine(Paket.OPOffSet);
60

            Console.WriteLine(Paket.OPByteCount);
61

            Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Authentic));
62

            Console.WriteLine(Paket.Encrypt);
63

            Console.WriteLine(Paket.Ver);
64

            Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.AddIn));
65

            Console.WriteLine(System.Text.Encoding.ASCII.GetString(Paket.Reserve));
66

            Console.WriteLine(Paket.Zero);
67

            Console.WriteLine(Paket.SizeOfHead);
68

            /////////////////////////////////
69

            test = Struct2Bytes<PaketHead>(Paket);
70

            ClientWriter.Write(test);
71

        }
72


73
























 

C++ Client:

 

  1

#include <winsock2.h>
  2

#pragma comment( lib, "ws2_32.lib" )
  3


  4

#pragma pack(push, 1)//取消内存大小自动对齐
  5


  6

typedef struct _PaketHead2
  7

{
  8

    UINT OPCode;/////////////
  9

    UCHAR DiskFlag;//////////
 10

    __int64 DiskSize;////////
 11

    __int64 OPOffSet;////////
 12

    __int64 OPByteCount;/////
 13

    UCHAR    Authentic[64];//
 14

    UCHAR    Encrypt;////////
 15

    UCHAR    Ver;////////////
 16

    UCHAR    AddIn[64];//////
 17

    UCHAR    Reserve[16];////
 18

    UCHAR    Zero;///////////
 19

    UINT SizeOfHead;/////////
 20

}PaketHead2,*pPaketHead2;
 21


 22

#pragma pack(pop)
 23


 24

//template <class T>
 25

//void ConvertToByteArray(T arg,unsigned char * Buffer) 
 26

//{
 27

//    for (int i=0;i<sizeof(T); i++)
 28

//    {
 29

//        int offset = i*8;
 30

//        Buffer[i] = (arg& (0xff << offset)) >> offset;
 31

//    }
 32

//}
 33

//
 34

//template <class T>
 35

//T ConvertBytesTo(byte *buf) 
 36

//{
 37

//    T ret = 0x0;
 38

//    for (int i=0;i<sizeof(T); i++) 
 39

//    {
 40

//        int offset = i*8;
 41

//        ret |= buf[i] << offset;
 42

//    }
 43

//    return (ret);
 44

//}
 45


 46

int ConnTest()
 47

{
 48

    SOCKET mySocket;
 49

    WORD wVersionRequested;
 50

    WSADATA wsaData;
 51

    int err;
 52


 53

    wVersionRequested = MAKEWORD( 2, 2 );
 54


 55

    WSAStartup( wVersionRequested, &wsaData );
 56


 57

    try
 58

    {
 59

        err = WSAStartup( wVersionRequested, &wsaData );
 60

        if ( err != 0 ) {
 61

            printf("Couldn't find a WinSock DLL\n");
 62

            return 1;
 63

        }
 64


 65

        if ( LOBYTE( wsaData.wVersion ) != 2 ||
 66

            HIBYTE( wsaData.wVersion ) != 2 ) 
 67

        {
 68

            printf("Couldn't find the right version for WinSock 2.2\n");
 69

            WSACleanup( );
 70

            return 1; 
 71

        }
 72


 73

        SOCKADDR_IN          ServerAddr;
 74


 75

        mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 76

        ServerAddr.sin_family = AF_INET;
 77

        ServerAddr.sin_port = htons(8021);    
 78

        ServerAddr.sin_addr.s_addr = inet_addr("192.168.0.5");
 79


 80


 81

        if (connect(mySocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr))) 
 82

        {
 83

            int error_code = WSAGetLastError();
 84

            printf("Error connecting socket: %d\n",error_code);
 85

            return 1;
 86

        }
 87


 88

        /////////
 89


 90

        PaketHead2 testhead2;
 91


 92

        memset(&testhead2,0x00,sizeof(PaketHead2));
 93


 94

        testhead2.DiskFlag = 0x1;
 95

        testhead2.OPCode = 9856;
 96

        testhead2.DiskSize = 78954612;
 97

        testhead2.OPOffSet = 98643217;
 98

        testhead2.OPByteCount = 85642311;
 99


100

        memcpy(testhead2.Authentic,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
101

        memcpy(testhead2.AddIn,"9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghij1234567\0",64);
102

        memcpy(testhead2.Reserve,"abcdefghij12345\0",16);
103


104

        testhead2.Encrypt = 0x2;
105

        testhead2.Ver = 0x4;
106

        testhead2.Zero = 0x0;
107

        testhead2.SizeOfHead = sizeof(PaketHead2);
108


109

        send(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
110


111

        memset(&testhead2,0x00,sizeof(PaketHead2));
112

        recv(mySocket,(char*)(&testhead2),sizeof(PaketHead2),NULL);
113


114

        /*testhead2.Authentic[63] = 0;
115

        testhead2.AddIn[63] = 0;
116

        testhead2.Reserve[15] = 0;*/
117


118

        printf("%d\n",testhead2.OPCode);
119

        printf("%d\n",testhead2.DiskFlag);
120


121

        printf("%ld\n",testhead2.DiskSize);
122

        printf("%ld\n",testhead2.OPOffSet);
123

        printf("%ld\n",testhead2.OPByteCount);
124


125

        printf("%s\n",testhead2.Authentic);
126

        printf("%d\n",testhead2.Encrypt);
127

        printf("%d\n",testhead2.Ver);
128


129

        printf("%s\n",testhead2.AddIn);
130

        printf("%s\n",testhead2.Reserve);
131

        
132

        printf("%d\n",testhead2.Zero);
133


134

        printf("%d\n",testhead2.SizeOfHead);
135

        //////////////////////////////////////////////////
136

        closesocket(mySocket);
137

        WSACleanup( );
138

    }
139

    catch(

)
140

    {
141

        printf("Error!\n");
142

    }
143

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: