C#服务端:
1using System;
2using System.Net.Sockets;
3using System.Net;
4using System.IO;
5using System.Diagnostics;
6using System.Threading;
7using 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
2using System.Net.Sockets;
3using System.Net;
4using System.IO;
5using System.Diagnostics;
6using System.Threading;
7using 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
6typedef 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
46int 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}
2#pragma comment( lib, "ws2_32.lib" )
3
4#pragma pack(push, 1)//取消内存大小自动对齐
5
6typedef 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
46int 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}