秀纳

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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

 

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( 22 );
 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}

posted on 2007-05-26 08:26  秀纳  阅读(3299)  评论(0编辑  收藏  举报