네트워크 통신/Boost

Boost.asio I/O 가변 크기 버퍼, 스트림 버퍼

마달랭 2024. 11. 8. 15:10
반응형

개요

데이터가 새로 추가될 때마다 동적으로 크기가 커지는 버퍼를 확장 가능한 버퍼라고 한다.

이러한 버퍼는 소켓에서 데이터를 읽을 때 들어오는 메시지의 크기를 알 수 없을 때 주로 사용한다.

 

어떤 어플리케이션 계층 프로토콜은 메시지의 크기를 정해놓지 않는다.

그 대신 메시지의 경계를 나타내는 일련의 기호 값들을 메시지의 끝에 덧붙이거나 전송 계층의 파일 끝 메시지를 전송하여 메시지를 모두 전송했다는 것을 알린다.

 

Boost.asio 라이브러리에서는 동적으로 확장할 수 있는 버퍼와 이를 받는 함수 모두 제공한다.

 

 

asio::streambuf

확장 가능한 스트림 기반 버퍼는 Boost.asio에서 asio::streambuf 클래스로 표시된다.

streambuf 클래스는 TSL 스트림 클래스가 필요한 상황에서도 사용할 수 있다.

그 뿐만 아니라 Boost.asio가 제공하는 여러 I/O 함수들은 이 클래스의 객체로 표현된 다양한 버퍼를 다룰 수 있다.

 

C++의 STL인 istream, ostream, iostream을 해당 객체에 할당할 수 있으며

스트림의 operator<<()와 operator>>() 연산자를 사용해 스트림에서 데이터를 읽고 쓸 수 있다.

 

#include <boost/asio.hpp>
#include <iostream>

using namespace boost;

int main()
{
	asio::streambuf buf;

	std::ostream output(&buf);

	// 스트림 기반 버퍼에 메시지 할당
	output << "Message1\nMessage2";

	// 줄 바꿈을 만날 때 까지 streambuf에서 데이터를 읽는다.
	std::istream input(&buf);

	// 문자열을 할당할 변수 초기화
	std::string message1;

	std::getline(input, message1);

	// message1 변수에 Message1 문자열이 할당되었다.
	std::cout << message1;

	return 0;
}

 

실행 결과

 

output << "Message1\nMessage2"를 할당한 순간 buf에는 해당 문자열이 들어오게 된다.

이후 input에 buf의 주소값을 할당해 동일 문자열을 갖게 된다.

getline을 통해 input의 스트림에서 줄바꿈이 등장 할때까지의 문자열을 message1에 할당한다.

message1을 출력하게 되면 Message1이 출력된다.

buf에는 이제 "Message2"가 남아있는 상태가 되었다.

 

 

728x90
반응형