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;
}
이것 이외에도 방식은 있으니 구글링도 해보기 바란다
댓글