C++로된 프로그램과 C#으로 만든 프로그램이 서로 패킷을 주고 받는 경우 외부 라이브러리를 사용하거나 C# 기본 기능을 사용한다.
외부 라이브러리로  CGDBuffer, protobuf, msgpack 등을 사용하거나 아니면 아래와 같이 직접 한다.

 

 

(C++)
// 패킷 헤더
struct PktHeader
{
 short PacketID;
 short BodySize;
};

 

// 로그인 패킷
struct PktReqLogin
{
 char UserID[17];
 char UserPW[17]
};

 

struct PktResLogin
{
 short ErrorCode;
};

 

 


[ C++ 서버로 패킷 보낼 때 ]
short packetID, string userID, string userPW;

 

var asciiUserID = System.Text.Encoding.Default.GetBytes(userID); // 멀티바이트 문자열. 유니코드 문자열은  System.Text.Encoding.Unicode.GetBytes
var dataUserID = new byte[16+1];
Buffer.BlockCopy(asciiUserID, 0, dataUserID, 0, asciiUserID.Length);

 

var asciiUserPW = System.Text.Encoding.Default.GetBytes(userPW);
var dataUserPW = new byte[16 + 1];
Buffer.BlockCopy(asciiUserPW, 0, dataUserPW, 0, asciiUserPW.Length);

 

List<byte> dataSource = new List<byte>();
dataSource.AddRange(BitConverter.GetBytes(packetID)); // 패킷 ID
dataSource.AddRange(BitConverter.GetBytes((Int16)(dataUserID.Length + dataUserPW.Length))); // 패킷 데이터(body)의 크기
dataSource.AddRange(dataUserID);
dataSource.AddRange(dataUserPW);

 

var send_data = dataSource.ToArray() // byte[]로 변환

 

 

[ C++ 서버에서 패킷 받았을 때 ]
var recvData = Network.Receive(); // receive로 데이터 받음

 

var packet = new PacketData();
packet.PacketID = BitConverter.ToInt16(recvData, 0);
packet.DataSize = BitConverter.ToInt16(recvData, 2);
packet.BodyData = new byte[packet.DataSize];

 

var errorCode = BitConverter.ToInt16(packet.BodyData, 0);
      

 

struct PacketData
{
 public Int16 PacketID;
 public Int16 DataSize;
 public byte[] BodyData;
}

 

 

 

이것 이외에도 방식은 있으니 구글링도 해보기 바란다

 

저작자 표시
신고
by 흥배 2016.09.05 08:00