패킷 전송시에 가변 길이 패킷과 고정길이 패킷이 나뉜다는 것을 알았다.
확실히 문자열 전송 간에 우리는 ㅇㅇ 도치지만 화나면 일장 연설을 하기도 한다.
또는 롤에서 채금 먹었을때.. 그러한 경우를 생각해보면 고정길이를 크게 해서 계속 보내는건 확실히 손해라고 생각된다.
때문에 가변길이 패킷을 전송하는 것은 확실히 매력적이다..
근데 쓰기가 복잡하다.. 많이 사용하지 않아서 그런지 모르겠지만 구글링을 통해 작성했었던 코드에 대해서 적어보려고 한다.
일단
첫 번째로 중요한 것은 char의 크기
두 번째로 중요한 것은 malloc 이다.
ex)
1 2 3 4 5 | typedef struct Test{ char *temp; }T; | cs |
라는 코드가 있을 때
T* str = new T();
new 키워드로는 동적할당을 그 크기밖에 해줄 수 없지만
T* str = (T*)malloc(length) 를 한다면
str 이 가르키고 있는 주소 공간을 굳이 구조체 T의 크기가 아닌 Length 만큼 늘려 줄 수 있다는 것을 이용하는 것이 가변길이 패킷의 핵심으로 보였다.
현재 str 은 4 바이트지만 IF length가 10 이라면 6바이트 만큼 더 쓸 수 있다.!
때문에
문자열을 buf[] 에 할당 받고
buf의 길이를 재고
구조체에 정보를 복사하기 전에 일단 크기를 할당한다.
여기서 구조체 의 temp변수를 동적 할당 즉 : temp = new char[strlen(buf)] 로 하고
strcpy(temp, buf) 해줘봤자 MUDADA (소용없다)..
왜냐면 send 함수시 send(sock, (struct sockaddr*)&str, ~~) 이런 식으로 보내게 될 텐데
str에 들어있는 temp 는 동적할당된 힙메모리에 할당되있는 문자열을 가르키는 것이지 temp가 가르키고 있는 주소공간에 문자열이 들어가 있는 것이 아니기 때문에
Server에서 받아봤자 호스팅 컴퓨터의 힙메모리를 가르키고 있는 주소를 받는 것이다. 서버 컴퓨터에는 주소가 가르키고있는 곳엔 전혀 다른 것이거나 없을 수 있다.
때문에 나는 memcpy 또는 Copymemory로 temp주소 자체에 문자열을 우겨 넣었다. 어차피 데이터일뿐이라고 생각했따..
그 후 서버에서 받은 다음에 큰 문자열 buf에 받아온 구조체의 temp를 복사하고 읽었다.
이런 방식을 사용하면서 이게 옳은 건지 의문이 들긴 들었다. 차라리 오히려 문자열을 크게 잡고 send시에 소켓에 복사하는 크기를 잘라내는 방법은 어땟을까 하고 고민해봤었다.
'서버프로그래밍' 카테고리의 다른 글
UDP를 이용한 채팅서버 만들기 (0) | 2018.06.24 |
---|---|
내 머릿속에 남아있는 HANDlE의 의의 (0) | 2018.05.27 |
브로드 캐스트 주소 구하기 (0) | 2018.05.27 |
서버 주소 변환 함수 (0) | 2018.05.27 |
간단한 Multi클라이언트 (0) | 2018.05.27 |