안녕하세요.
정초부터 질문을 드려 죄송합니다.
클라이언트로부터 xml데이터를 전송받는데 헤더를 정의하지않아 전체 데이터의 사이즈를 알수 없습니다.
그렇다고 버퍼사이즈를 무작정 크게 해놀수도 없고 이경우에 서버에서 recv함수를 어떤식으로 구현을 해야할까요?
통신고수님들의 도움을 기다립니다.^^;;
파일로 일단 저장을 하실건지 아니면 메모리에만 내용을 유지할건지에 따라 달라질텐데요. 일단 XML이라면 내용이 그리 크지 않을테니 메모리에 유지하는 경우가 많겠죠.
메모리에만 저장한다면 우선 고정된 사이즈의 내부버퍼로 패킷을 수신 합니다. 그리고 수신된 사이즈만큼 동적메모리로 복사(추가)를 하는데 이 과정은 동적메모리를 자동으로 늘려주면서 추가를 하는 함수를 만드시면 됩니다.
아래는 좀 다른 경우에 사용했지만 제가 사용하는 함수입니다. 단, 이 함수는 문자열을 대상으로만 사용 할 수 있습니다. 수신하는 데이터가 바이너리 데이터인 경우에는 사용 할 수 없습니다.
/**
* str_append - 기존 문자열에 새로운 문자열 추가
*
* @parm ptr(IN/OUT): 기존 문자열 포인터
* @parm str: 추가할 문자열
* @return: 성공 시 0, 실패 시 -1
*
* 기존 문자열이 NULL인 경우 새로운 메모리를 할당하고, NULL이 아닌 경우
* 새로운 문자열을 추가하기 위한 공간만큼 기존 문자열 메모리를 확장한 후
* 새로운 문자열을 추가한다.
*/
int
str_append(unsigned char **ptr, const unsigned char *str)
{
ASSERT(str);
/* +1 is terminating null */
if (!*ptr)
*ptr = xcalloc(1, strlen(str) + 1);
else
*ptr = xrealloc(*ptr, strlen(*ptr) + strlen(str) + 1);
if (!*ptr)
return -1;
strcat(*ptr, str);
return 0;
}
파일로 일단 저장을
파일로 일단 저장을 하실건지 아니면 메모리에만 내용을 유지할건지에 따라 달라질텐데요. 일단 XML이라면 내용이 그리 크지 않을테니 메모리에 유지하는 경우가 많겠죠.
메모리에만 저장한다면 우선 고정된 사이즈의 내부버퍼로 패킷을 수신 합니다. 그리고 수신된 사이즈만큼 동적메모리로 복사(추가)를 하는데 이 과정은 동적메모리를 자동으로 늘려주면서 추가를 하는 함수를 만드시면 됩니다.
아래는 좀 다른 경우에 사용했지만 제가 사용하는 함수입니다. 단, 이 함수는 문자열을 대상으로만 사용 할 수 있습니다. 수신하는 데이터가 바이너리 데이터인 경우에는 사용 할 수 없습니다.
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
클라이언트 수정은 불가인가요?
저는 통상 보내고 받는 사이즈가 가변적일 경우,
하나의 data를 보내기 위해 2번의 통신을 합니다.
1. 사이즈
2. data
이런식으로요..
client 수정이 가능하시다면 저런식으로 처리를 하시는 것도 괜찮을 듯 합니다.
다만 주의 하실게, 처음 사이즈 보낼 때 long 변수 등을 보내시면 byte ordering에서 신경을 써야 겠지요...
Re: 데이터 사이즈를 모를때 수신방법
전송에 사용하는 데이터 포맷이 XML이라면, 닫는 root 노드를 찾을때까지 읽은뒤 처리하거나
SAX파서를 이용해서 데이터를 읽으면서 처리를 하는 방법은 어떨까요?
..
두가지 방법이 있습니다.
1. 특정한 사이즈를 특정한 시간동안 수신한다.
2. 무한정 사이즈를 특정한 시간동안 수신한다.
두가지 모두 수신 길이가 0일때 까지 수신해보시면 전송되는 전체가 되게 됩니다.
클라이언트 수정이 정답일 것 같습니다.
통신하는 프로토콜상의 데이터 길이를 모르는 경우,
1.통신 데이터를 String으로만 취급하면 특수한 경우를 제외하고는
통신이 어려울 것으로 보입니다.
2. XML 파서를 이용해 데이터의 내용으로 데이터 끝을 추정하여야 합니다.
위 사항 모두 길이 정보 4byte(아닐수도 있지만) 오버헤드의 수백배의 cost가 소요될 것 입니다.
통신 메시지는 length + data 가 최소한의 필수사항일 것 같습니다.
답변주신 모든분께 감사드립니다.
모두 새해복많이 받으세요..
가능하시다면...
가능하시다면 어떤 방식으로 어떻게 해결하셨는지도 적어주셨으면 좋겠습니다. 비슷한 문제를 겪는 경우에 참고할 수 있으니까요. KLDP에서는 말머리를 붙이는지 모르겠지만 해결되셨다면 글 제목도 [해결] 같은 것을 붙이시면 더 좋을 것 같아요.
블로그: http://turtleforward.blogspot.com
댓글 달기