본문 바로가기
IT

c++, c# 의 소켓통신에 관하여, 문자열, 파일, 구조체 전송에 대하여

by 신림83 2021. 7. 15.
반응형

c++, c#의 소켓통신에 관하여, 문자열, 파일, 구조체 전송에 대하여

과거에는 프로젝트를 진행하면 서버, 클라간의 언어를 맞추는 경우가 많았습니다. 제가 게임 쪽에서 좀 일해서 cpp 서버에 cpp 클라 같은 경우는 많이 존재했죠.

 

하지만 클라, 서버의 다양성이 늘어남에 따라, 클라의 경우는 지원하는 엔진이 사용하는 언어, 서버의 경우는 웹서버, 소켓 서버, 작업자의 능숙도 등이 고려되어 서로 다른 언어로 작업된 작업물들이 통신을 해야 되는 경우가 많이 생기고 있습니다. 

 

그중 c++, c#이 서로 통신을 하는 경우에 대해 좀 보려합니다.

코드 관련 이야기는 거의 안쓸 계획입니다. 예제 코드 관련해서는 링크해서 남겨두도록 하겠습니다. 크게는 닷넷 환경에 대한 이야기가 될 수도 있겠습니다. 

 

문자열의 경우

일단 문자열을 보내는 통신을 한다고 가정하면, c#은 Unicode를 사용합니다. c++ char 형태가 기본일 수 있는데, 이를 c++에서 wchar_t 등으로 맞추어주면 되겠습니다. *wchar_t는 2byte, char은 1byte 임을 알자.

 

파일의 경우

파일은 주로 바이너리 데이터로 전송되기 때문에 별도의 처리가 없어도 될 것입니다.

 

구조체의 경우

구조 체화된 데이터를 이용하시는 게 편한 경우가 많습니다. 구조체의 경우는 몇 가지 방법이 있습니다.

 

BitConvert 등을 사용해서 구조체의 값을 찾아내는 방법

 [Serializable]
 [StructLayout(LayoutKind.Sequential)]
 struct Data
 {
      [MarshalAs(UnmanagedType.U2, SizeConst = 2)]
      public ushort size;

      [MarshalAs(UnmanagedType.U2, SizeConst = 2)]
       public ushort id;

       [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
       public UInt32 data;
  };

c# 구조체 가정

 

 ushort size = BitConverter.ToUInt16(bytesForWrite, 0);
 ushort id = BitConverter.ToUInt16(bytesForWrite, 2);
 UInt32 data = BitConverter.ToUInt32(bytesForWrite, 4);

 Data receiverData1;
 receiverData1.size = size;
 receiverData1.id = id;
 receiverData1.data = data;

string result1 = String.Format("Size:{0},ID:{1},Data:{2}", receiverData1.size, receiverData1.id, receiverData1.data);
Console.WriteLine(result1);

c++에서 찾아오는 과정, 이와 같이 작업을 한다고 생각하면, 구조체 멤버들의 크기를 사용자가 정확히 알고 있어야 합니다. 간단한 테스트로는 쓸만하겠지만, 큰 프로젝트에서는 쉬운 일이 아닙니다.

 

 

마샬링, 바이너리 포메터를 이용하는 방법

특정 스트림이 지원하는 직렬화를 이용하여 작업하는 방식입니다. 간단화된 코드를 보면 다음과 같습니다.

BinaryFormatter formatter = new BinaryFormatter();
Data receiverData = (Data) formatter.Deserialize(networkStream);

요 방법이 훨씬 편한 거 같습니다. 자세한 구현 관련 소스들은 링크시켜 두겠습니다.

 

참고 링크

문자열과 파일에 관하여

https://nowonbun.tistory.com/737

 

소켓통신, 구조체, 바이너리, 마샬링 관련 내용

https://202psj.tistory.com/1253

 

마샬링 관련 구현 링크(소스)

#1

#2

#3

#4

 

바이너리 포메터 구현 링크(소스)

$1

$2

 

이분 블로그의 TCP/IP 설명글이 볼만한 가치가 있었습니다.

https://it-jerryfamily.tistory.com/

 

감사합니다.

반응형

댓글