STX | HEADER | 본문 | CRC | ETX 이렇게 끝나는 아주 일반적인 패킷인데
우리 수석님은 이렇게 쓰라고 하시더군요.
메세지 헤더 구조체
struct HEADER
{
STX
int nFrameLen; 전체패킷길이
int nDataLen데이터길이
char *cData //본문 포인터
}
이렇게 해놓고 Data 에 New 데이터 길이만큼 메모리 선언해서 씀
저는 저렇게 하면 매번 cData 에 대해 다시 메모리 할당 해줘야되고 다른쓰레드로 패킷을 넘기거나 할때에도 매번 cData 값을 별도로 memcopy 해줘야하고
잘못해서 cData 에 무표포인터 값이라도 들어가면 골아프고 하니 저는
struct HEADER
{
int nFrameLen; 전체패킷길이
int nDataLen데이터길이
// char *Data //본문 포인터 <-- 이걸 빼고
}
패킷 전체길이만큼 바이트 로 메모리 선언하고 앞에껀 (HEADER*) 로 캐스팅 해서 헤더값 빼서쓸거있으면 쓰고
뒤에오는 데이터는 HEADER 길이만큼 포인터를 이동시키면 바로 Data 포인터를 참고가능하니 저렇게 쓰는게 낫다고 했더니
그게 뭔차이냐고 따지는데... 아 골아프네요.
(HEADER*) 로 받은 통신 패킷 캐스팅 해도 저 위에 수석님 스타일로 하면 cData 에 포인터값 이아닌 본문값이 들어가서 거슬림
여러분들은 통신패킷 짤때 어떻게 하시나요.
제 방식이 좀더 일반적인듯한데
그냥 저 헤더 구조체를 만들고 헤더를 상속하는 구조체를 또 만들면 해결되는 거 아님? 아니면 포함하거나
struct header{ /* 헤더 내용물*/ }; struct packet_name : public header { /*패킷 내용물*/ };
or struct packet_name { header header_name; /*패킷 내용물*/ };
제페 // 그런방법도 있었네요
제페// 그런데 Data 내용이 0~2메가 까지 가변이랍니다. 2메가라서 array 로써 선언할 수가없어요 ㅠㅠ 선언하면 스택 더달라고 빽! 하네요. 스택 조정은 피하려고합니다.
제페// 그래서 저는 바이트로 전체길이만큼 패킷 메모리 allloc 잡고 앞에 헤더 memcpy 중간에 데이터 memcpy 하고 끝에 CRC랑 ETX 붙일 예정입니다. 다른곳에서는 앞에 HEADER 만 떼어보면 전체 패킷에 접근할수가 있으니까요. Data 포인터 변수를 붙이면 패킷 보낼때 헤더 보내고 ,
Data 포인터 변수 4바이트 건너뛰고 뒤에 데이터 부터 다시 보내는 번거로움이 있어서요
제페// 구조체를 패킷 내용마다 다 상속받아 선언해서 사용하는 방법도 있지만 패킷이 넘 많고. 일일히 그걸 파싱해야될 이유도없는 상황이라 굳이 하나씩 상속받아 선언하지않으려고합니다