Boost C++ Libraries/Boost.Asio

Boost.Asio 색인 - buffer

까마귀75 2021. 1. 13. 16:15
728x90
반응형

buffer

boost::asio::buffer 함수는 원시(raw) 메모리, POD 요소의 배열, POD 요소의 벡터 또는 std::string을 나타내는 버퍼 생성에 사용된다.

주어진 버퍼에서 수정할 수 있는 새 버퍼를 생성한다.

[1 / 32 오버로드]

mutable_buffer buffer(
    const mutable_buffer & b);

[buffer]

 

[2 / 32 오버로드]

mutable_buffer buffer(
    const mutable_buffer & b,
    std::size_t max_size_in_bytes);

[buffer]


주어진 버퍼에서 수정할 수 없는 새 버퍼를 생성한다.

[3 / 32 오버로드]

const_buffer buffer(
    const const_buffer & b);

[buffer]

 

[4 / 32 오버로드]

const_buffer buffer(
    const const_buffer & b,
    std::size_t max_size_in_bytes);

[buffer]


주어진 메모리 범위를 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[5 / 32 오버로드]

mutable_buffer buffer(
    void * data,
    std::size_t size_in_bytes);

[buffer]


주어진 메모리 범위를 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[6 / 32 오버로드]

const_buffer buffer(
    const void * data,
    std::size_t size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[7 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N]);

[buffer]

 

[8 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N],
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[9 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N]);

[buffer]

 

[10 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N],
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[11 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data);

[buffer]

 

[12 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[13 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data);

[buffer]

 

[14 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]

 

[15 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data);

[buffer]

 

[16 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[17 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data);

[buffer]

 

[18 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[19 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data);

[buffer]

 

[20 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]

 

[21 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data);

[buffer]

 

[22 / 32 오버로드]

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 벡터을 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[23 / 32 오버로드]

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data);

[buffer]

 

[24 / 32 오버로드]

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 POD 벡터을 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[25 / 32 오버로드]

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data);

[buffer]

 

[26 / 32 오버로드]

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 문자열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[27 / 32 오버로드]

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data);

[buffer]

 

[28 / 32 오버로드]

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 문자열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[29 / 32 오버로드]

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data);

[buffer]

 

[30 / 32 오버로드]

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);

[buffer]


주어진 string_view를 나타내는 수정할 수 있는 새 버퍼를 생성한다.

[31 / 32 오버로드]

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data);

[buffer]


주어진 string_view를 나타내는 수정할 수 없는 새 버퍼를 생성한다.

[32 / 32 오버로드]

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data,
    std::size_t max_size_in_bytes);

[buffer]

버퍼 개체는 포인터와 크기(바이트)로 구성된 2-튜플(tuple:단위를 나타냄)로서 메모리의 연속적인 영역을 나타낸다. {void*, size_t} 유형의 튜플(tuple)은 메모리의 변경 가능한(수정 가능한) 영역을 지정한다. 마찬가지로 {const void*, size_t} 유형의 튜플(tuple)은 메모리의 const(수정 불가능한) 영역을 지정한다. 이 두 유형은 각각 mutable_bufferconst_buffer 클랙스에 해당한다. C++의 변환 규칙을 반영하기 위해 mutable_buffer는 암시적으로 const_buffer로 변환할 수 있으며, 반대의 변환은 허용되지 않는다.

가장 간단한 사용 사례는 지정된 크기의 단일 버퍼를 읽거나 쓰는 것이다:

sock.send(boost::asio::buffer(data, size));

위의 예에서 boost.::asio::buffer의 반환 값은 ConstBufferSequence 개념의 요구 사항을 충족하므로 소켓의 쓰기 함수오 바로 전달될 수 있다. 또한 수정할 수 있는 메모리로 만들어진 버퍼도 MutableBufferSequence 개념의 요구 사항을 충족한다.

개별 버퍼는 내장 배열, std::vector, std::array 또는 POD 요소의 boost::array에서 생성될 수 있다. 이렇게 하면 버퍼 크기를 자동으로 결정하여 버퍼 오버런을 방지할 수 있다.

char d1[128];
size_t bytes_transferred = sock.receive(boost::asio::buffer(d1));

std::vector<char> d2(128);
bytes_transferred = sock.receive(boost::asio::buffer(d2));

std::array<char, 128> d3;
bytes_transferred = sock.receive(boost::asio::buffer(d3));

boost::array<char, 128> d4;
bytes_transferred = sock.receive(boost::asio::buffer(d4));

위의 세 가지 경우 모두, 생성된 버퍼 길이는 정확하게 128 바이트이다. 주의할 점은 벡터는 버퍼를 만들거나 사용할 때 자동으로 크기가 조정되는 않는다. 버퍼 크기는 용량이 아니라 벡터의 size() 멤버 함수를 사용해 결정된다.

버퍼 내용에 접근

버퍼의 내용은 data()size() 멤버 함수를 사용해 접근할 수 있다:

boost::asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

boost::asio::const_buffer b2 = ...;
std::size_t s2 = b2.size();
const void* p2 = b2.data();

 

dat() 멤버 함수는 유형 안정성 위반을 허용하므로, 응용 프로그램 코드에서 data()의 사용은 신중하게 고려되어야 한다.

편의를 위해, 버퍼와 버퍼 시퀀스(즉, ConstBufferSequence 또는 MutableBufferSequence 유형 요구 사항을 충족하는 유형) 둘 다 작동하는 buffer_size 함수가 제공된다. 이 경우 함수는 시퀀스에 포함된 모든 버퍼의 전체 크기를 반환한다.

버퍼 복사

buffer_copy 함수는 개별 버퍼와 버퍼 시퀀스 간에 원시(raw) 바이트를 복사하는 데 사용할 수 있다.

특히 buffer_size 함수와 사용할 경우, buffer_copy 함수는 버퍼 시퀀스를 선형화하는 데 사용할 수 있다. 예를 들면:

vector<const_buffer> buffers = ...;

vector<unsigned char> data(boost::asio::buffer_size(buffers));
boost::asio::buffer_copy(boost::asio::buffer(data), buffers);

buffer_copy 함수는 memcpy 기반으로 구현되므로 겹치는 메모리 영역 간에 복사 작업에 사용할 수 없다.

버퍼 무효화

버퍼 개체는 참조하는 메모리의 소유권이 없다. 더 이상 I/O 작업이 필요하지 않을 때까지 메모리 영역이 유효하게 남아있도록 보장하는 것은 응용 프로그램의 책임이다. 메모리를 더 이상 사용할 수 없으면, 버퍼가 무효화되었다고 한다.

std::vector 유형의 인수를 허용하는 boost::asio::buffer 오버로드의 경우, 반환된 버퍼 개체는 시퀀스의 요소를 참조하는 모든 참조, 포인터와 반복기(iterator)를 무효화하는 벡터 연산에 의해 무효화된다. (C++ Std, 23.2.4)

std::basic_string 유형의 인수를 허용하는 boost::asio::buffer 오버로드의 경우, 반환된 버퍼 개체는 시퀀스의 요소를 참조하는 참조, 포인터와 반복기(iterator)의 무효화 정의 규칙에 따라 무효화된다. (C++ Std, 21.3)

버퍼 산술연산

버퍼 개체는 버퍼 오버런을 방지하는 안전한 방식으로 간단한 산술 연산을 처리할 수 있다. 다음과 같이 초기화된 배열을 고려한다:

boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };

버퍼 개체 "b1"은 다음을 사용하여 생성하고:

b1 = boost::asio::buffer(a);

전체 배열 {'a', 'b', 'c', 'd', 'e'}를 나타낸다. boost::asio::buffer 함수에 대한 선택적인 두 번째 인수를 사용하여 버퍼의 크기(바이트 단위)를 제한할 수 있다.

b2 = boost::asio::buffer(a, 3);

"b2"는 데이터 {'a', 'b', 'c'}를 나타낸다. "size" 인수가 배열의 실제 크기를 초과하더라도 생성되는 버퍼 개체의 크기는 배열 크기로 제한된다.

오프셋을 주어진 버퍼에 적용하여 새 버퍼를 만들 수 있다:

b3 = b1 + 2;

여기서 "b3"은 {'c', 'd', 'e'}를 나타내도록 설정된다. 오프셋이 주어진 버퍼의 크기를 초과하면, 새로 생성된 버퍼는 비어 있을 것이다.

오프셋과 크기를 모두 지정하여 주어진 버퍼내에서 특정 범위의 바이트에 해당하는 버퍼를 만들 수 있다:

b4 = boost::asio::buffer(b1 + 1, 3);

따라서 "b4"는 {'b', 'c', 'd'} 바이트를 참조한다.

버퍼와 분산-수집(Scatter-Gather) I/O

다중 버퍼(예: 분산-수집 I/O)를 사용하여 읽거나 쓰려면, 다중 버퍼 개체를 MutableBufferSequence(읽기용) 또는 ConstBufferSequence(쓰기용) 개념을 지원하는 컨테이너에 할당할 수 있다:

char d1[128];
std::vector<char> d2(128);
boost::array<char, 128> d3;

boost::array<mutable_buffer, 3> bufs1 = {
  boost::asio::buffer(d1),
  boost::asio::buffer(d2),
  boost::asio::buffer(d3) };
bytes_transferred = sock.receive(bufs1);

std::vector<const_buffer> bufs2;
bufs2.push_back(boost::asio::buffer(d1));
bufs2.push_back(boost::asio::buffer(d2));
bufs2.push_back(boost::asio::buffer(d3));
bytes_transferred = sock.send(bufs2);

요구 사항

일반 헤더: boost/asio/buffer.hpp
편의 헤더: boost/asio.hpp

Boost.Asio 홈

728x90
반응형