게임 프로그래머의 만담, 게임코디 2nd
0 투표
629 views 만담 (888p) , 629 views
 private byte[] CreateHeader(int index)
    {
        int headerSize = 1024;

        byte[] header = new byte[headerSize];

        Array.Copy(BitConverter.GetBytes(index), header, BitConverter.GetBytes(index).Length);

        return header;
    }

 

네트워크 공부중에 키워드 검색에 실패해서 게임코디에 질문 드립니다.

 

조금 기초적인 문제일 것 같지만 바이트 배열은 많이 써본적이 없어서 질문드립니다.

 

코드는 실제 데이터랑 같이 보낼 헤더를 만드는 함수입니다.

 

int하나를 받아서 Array.Copy로 헤더에 복사를 하는데요,

 

헤더에 다른 자료형 정보가 추가되면 코드가 조금 길어질 것 같더라구요.

 

간편한 방법이 있을까요?

 

함수를 만들어서 노가다를 조금 줄일수는 있을 것 같긴한데, 그 외에는 생각나는게 없어서 질문드립니다.

 

만담에 대한 답글을 하려면 로그인 또는 가입해야합니다.

2 answers

0 투표
보통 헤더 먼저 보내고 그다음 내용 보내고 하는 식 아닌가요?

네트워크면 소켓통신으로 데이터 주고받기 하실거 같은데, 헤더에 내용 패킷의 길이같은 정보를 포함시켜서 넣을것 같은데요
답글 (51p)
제가 봤던 코드에선 헤더를 먼저 보내는게 아니라, 헤더와 패킷을 함께 보내더라구요.
헤더만큼의 바이트를 먼저 해석하고 거기에서 패킷 길이를 얻는 방식이었어요
+1 vote
저도 지금 하고 있는 프로젝트가 비슷한걸 써서 헤더랑 정보를 합쳐서 보내고 있거든요.

헤더 구조체를 만들어서 그걸 마샬링해서 byte[]로 만들고

헤더 + 내용 길이의 byte[]를 하나 만들어서 둘다 카피하는 무식한 방법을 하고 있긴 합니다. (전 랜더링 프로그래머인데..ㅠ.ㅠ)

헤더에 자료형이 추가되도 코드 수정은 구조체와 구조체 생성자만 하면 되니까 크게 변경점은 없지만

그외에 단점들이 좀 있는 편이기는 합니다.

한번 참고해 보세요.
답글 (136p)
public static void ByteArrayToStructure<T>(byte[] bytearray, ref T obj)
        {
            int len = Marshal.SizeOf(obj);

            IntPtr i = Marshal.AllocHGlobal(len);

            Marshal.Copy(bytearray, 0, i, len);

            obj = Marshal.PtrToStructure<T>(i);

            Marshal.FreeHGlobal(i);
        }
마샬링이라고 하는군요! 웹에서 소스코드를 찾았습니다!

감사합니다.

것보다 댓글로는 소스 코드를 못쓰는군요.
int headerSize = 1024;
byte[] header = new byte[headerSize];
대신
var buffer = pool.get();
... copy copy ...
return new ArraySegment<byte>(buffer, 0, use_length);
이런식으로 ArraySegment 를 활용해도 괜찮을거 같습니다.

게임 프로그래머의 만담 커뮤니티, 게임코디 입니다

온종일 코드와 씨름하는 우리들의 외로움을 삭이고자 합니다