이 블로그 검색

2016년 12월 12일 월요일

CumBuffer : accumulating byte buffer for c++


네트워크 TCP 프로그램인 경우에 임의 길이의 작은 데이터 조각을 수신해서 누적(버퍼링)시키다가 일정 길이가 수신되면 완전한 하나의 packet으로 보고 해당 데이터를 처리하는 경우가 꼭 필요하다. 지금까지는 그냥 new, calloc 등으로 데이터를 수신할때마다 동적으로 할당해서 기존 데이터를 복사하는 방식으로 해왔는데(동적할당 제거에 의한 성능개선이 크지 않았기에), 이번에 동적 할당없이 사용할 수 있는 버퍼를 구현해 보았다. 일종의 ring buffer 라고도 할수 있다.

https://github.com/jeremyko/CumBuffer


기본 사용법



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "CumBuffer.h"
 
CumBuffer buffering;
   
if(cumbuffer_defines::OP_RSLT_OK == buffering.Init(9)) //버퍼길이 9 byte로 초기화
{
    return false;
}
   
char data   [100];
char dataOut[100];
   
//3 byte 저장
memset(data, 0x00, sizeof(data));
memcpy(data, (void*)"aaa", 3);
if(cumbuffer_defines::OP_RSLT_OK != buffering.Append(3, data))
{
    return false;
}
 
//4 byte 저장
memset(data, 0x00, sizeof(data));
memcpy(data, (void*)"abbb", 4);
if(cumbuffer_defines::OP_RSLT_OK != buffering.Append(4, data))
{
    return false;
}
 
if(buffering.GetCumulatedLen()!=7) //현재까지 저장된 데이터 길이 7
{
    return false;
}
 
//4 byte 추출
memset(dataOut, 0x00, sizeof(dataOut));
if(cumbuffer_defines::OP_RSLT_OK != buffering.GetData(4, dataOut))
{
    return false;
}
 
if( strcmp("aaaa", dataOut)!=0)
{
    return false;
}
   
//3 byte 추출
memset(dataOut, 0x00, sizeof(dataOut));
if(cumbuffer_defines::OP_RSLT_OK != buffering.GetData(3, dataOut))
{
    return false;
}
 
if( strcmp("bbb", dataOut)!=0)
{
    return false;
}

동적 할당과 비교를 위한 benchmark 소스
https://gist.github.com/jeremyko/5ddd7796da25918962da0f6ad34e02ae 



댓글 없음:

댓글 쓰기