c#

C++서버 C#클라 패킷 전송 (구조체 변환, 마샬링,object - byte[])

sieunju 2016. 7. 25. 01:08
반응형

안녕하세요 j.sieun 입니다. 

이번글에는 C++ 서버에서 C#클라이언트의 데이터 송,수신에 대해 적어보겠습니다.


조건 : 제가 사용하고있는 서버는 클라에서 byte로 형변환 한후에 보내는 형식입니다. 

클라이언트에서 마샬링을 통해 struct 인 구조체를 byte로 변환한 후 서버로 send 해보겠습니다.

제가 사용한 네임 스페이스는

using System;

using System.Runtime.InteropServices;

using System.Net.Sockets;

using System.Net;


//구조체 생성

        [Serializable]

        [StructLayout(LayoutKind.Sequential)]

        struct datapacket

        {

            //그렇게 크게 데이터를 전송할 필요가 없어서 short 값으로 했습니다. 

//

            [MarshalAs(UnmanagedType.U2)]

            public short size;

            [MarshalAs(UnmanagedType.U2)]

            public short type;

//바이트는 4byte로 전송.

            public byte [] get_Buffer()

            {

                return new byte[4];

            }

            //구조체를 배열로 바꾸는 부분

            public byte[] Serialize()

            {

                var buffer = new byte[Marshal.SizeOf(typeof(datapacket))];

          var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);

                var pBuffer = gch.AddrOfPinnedObject();


                //구조체를 바꾸는 부분

                Marshal.StructureToPtr(this, pBuffer, false);

                gch.Free();


                return buffer;

               

            }

            

            //배열을 구조체로

            public object RawDeSerialize(byte[] data, Type dataType)

            {

                int RawSize = Marshal.SizeOf(dataType);

               //만약에 데이터가 없으면 리턴값은 null값에 취한다.

                if (RawSize > data.Length)

                {

                    return null;

                }

                    

                IntPtr buffer = Marshal.AllocHGlobal(RawSize);

                Marshal.Copy(data, 0, buffer, RawSize);

                datapacket datapacket = new datapacket();

                object objData = Marshal.PtrToStructure(buffer, dataType);

                Marshal.FreeHGlobal(buffer);


                return objData;

              }

        }


디버깅 중간에 중단점을 걸어서 데이터가 어떻게 보내고 받는지를 보겠습니다.


이부분은 클라에서 구조체를 만든후, 그 구조체를 서버로 보낼려면 byte로 형변환해야 하기때문에 

Serialize() 메서드를 사용하여 buffer값을 얻어낸 결과입니다.


이 사진은 서버가 클라에서 온 데이터를 출력한 부분입니다. 

그리고 서버는 클라한테 데이터를 보냅니다. 물론 byte형식으로 보냅니다.

저는 여기서 size 4 type 159 를 보냈습니다.


RawDeSerialize() 라는 메서드 맨 마지막에 return objData 가 있는데 그 objData 의 최종 값입니다.


그리고 이걸 출력해보았습니다. 


아직 제가 objData 의 값을 출력을 못했는데, 이거에 대해서 해결할수 있는 분 계시면 댓글 남겨주시길 바랍니다. 

아니면 j.sieun73@gmail.com 여기로 메일 보내주시면 대단히 감사합니다. 


그래서 출력은 서버에서 받는 byte 에 있는걸로 출력했습니다. 


감사합니다.


반응형