안녕하세요 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 에 있는걸로 출력했습니다.
감사합니다.
'c#' 카테고리의 다른 글
C# 메모리문제에 대해서#미해결 (2) | 2017.02.21 |
---|---|
C# AutoResetEvent 를 이용한 쓰레드 제어 (0) | 2016.12.28 |
마샬링 구조체[] byte 오류에 대해서 (0) | 2016.07.27 |