반응형

boost.asio 25

Boost.asio I/O 소켓 종료하기와 닫기

개요이전 글에서 다루었던 cancel() 메서드의 경우 연산이 시작되고 난 후 해당 소켓 객체에서 호출되어야만 한다.TCP 프로토콜로 통신하는 어떤 분산 어플리케이션은 메시지의 크기가 고정되어 있지도 않고, 특정 바이트 순열로 메시지의 끝을 나타내는 것도 아닌 경우가 있다.따라서 소켓에서 메시지를 읽어들이는 동안 어디서 메시지가 끝나는지 메시지 자체로는 알 수 없다.헤더 영역과 본문 영역으로 메시지를 구성해 메시지의 끝을 알릴 수도 있다.헤더 부분은 크기가 고정되어 있고 미리 정해진 구조를 따르면서 본문 부분의 크기를 알리는 것이다.그러면 수신하는 측에서 헤더 부분만 먼저 읽어 분석하기만 하면 메시지 본문의 크기를 알 수 있고, 나머지 메시지를 적절하게 읽을 수 있다.이 방법은 매우 간단하며 널리 사용되..

Boost.asio I/O 비동기 연산 취소하기

개요비동기 연산을 시작하도록 한 후에 아직 완료되지 않았지만 종료하고 싶을 수가 있다.더 이상 해당 작업이 필요 없거나, 도중에 다른 방향으로 연산을 하고 싶을 때 등등클라이언트 입장에선 시작은 했지만 아직 끝나지 않은 연산을 종료할 수 있다면 좋은 기능이다.네트워크 통신 연산은 예측하지 못할 정도로 긴 시간이 걸릴 수도 있으므로 취소하는 기능을 제공하는 것은 중요하다.  cancel()일단 코드를 먼저 작성하고 리뷰를 진행한다.#include #include #include using namespace boost;int main(){ std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333; try { ..

Boost.asio I/O TCP 소켓 비동기적 읽기

개요Boost.asio 라이브러리가 제공하는 가장 기본적인 비동기 데이터 읽기 함수는 async_read_some() 메서드다.이전 글들을 참고한다면 알 수 있겠지만 해당 메서드는 여타 some함수와 동일하다. 쓰기와 마찬가지로 버퍼, 콜백 함수 두 가지 인자를 받는다.또한 데이터 읽기 작업 중 예외가 발생할 경우 콜백 함수를 호출한다.만약 데이터를 모두 읽지 못했는데 TCP통신 중 모종의 이유로 중단될 경우 추가적으로 함수를 호출해 주어야 한다.  async_read_some()이 메서드는 소켓의 데이터 중 일부를 읽어 버퍼에 쓰는 연산을 시작한다.해당 비동기 연산이 오류 없이 끝난다면 적어도 한 바이트는 읽는다는 보장이 있다.일반적으로 소켓의 데이터를 모두 읽으려면 이 비동기 메서드를 여러 번 호출해..

Boost.asio I/O TCP 소켓 비동기적 쓰기

개요비동기적 쓰기는 원격 프로그램으로 데이터를 보내는 유연하면서도 효율적인 방법이다.Boost.asio 라이브러리가 제공하는 가장 기본적인 비동기 데이터 쓰기 함수는 async_write_some() 메서드이다.동기적 쓰기에 비해 앞에 async_가 붙은 것을 확인할 수 있다. 동기적 I/O와 유사하게 some()이 붙지 않은 더 편하게 사용할 수 있는 함수가 asio에 있지만, 해당 함수들 모두 결국에는 내부적으로 some()이 붙은 함수를 사용하기에 함수 원형을 먼저 공부하는게 도움이 될 것이다.  async_write_some()Boost.asio 라이브러리가 제공하는 가장 기본적인 비동기 데이터 쓰기 함수이다.이 메서드는 쓰기 연산을 시작한 후 곧바로 반환한다.첫 번째로 소켓에 쓸 데이터를 가진 ..

Boost.asio I/O TCP 소켓 동기적 읽기

개요TCP 소켓에서 읽는다는 것은 이 소켓에 연결된 원격 프로그램이 보낸 데이터를 받는다는 의미다.Boost.asio가 제공하는 소켓을 사용해 데이터를 수신하는 가장 간단한 방법은 동기적으로 읽는 것이다.쓰기와 마찬가지로 동기적 방식은 실행 중인 스레드를 멈추게 하고, 데이터를 모두 읽거나 오류가 발생하면 멈춘 스레드를 다시 풀어준다. Boost.asio 라이브러리로 소켓에서 데이터를 읽는 방법 중 가장 기본적인 방법이다.이 메서드는 쓸 수 있는 버퍼를 인자로 받고, 소켓에서 읽은 일부 데이터를 버퍼에 쓴다.이 함수가 성공하면 몇 바이트나 읽었는지를 반환한다.이 메서드가 몇 바이트를 읽을지는 제어할 수 없다.다만 오류가 나지 않는 한 적어도 한 바이트 이상을 읽는다는 것을 보장한다.일반적으로 소켓에서 일..

Boost.asio I/O TCP 소켓 동기적 쓰기

개요TCP 소켓에 쓴다는 것은 이 소켓에 연결된 원격 어플리케이션으로 데이터를 보내는 출력 연산을 한다는 뜻이다.Boost.asio가 제공하는 소켓 연산 중 가장 간단하게 데이터를 보내는 방법은 동기화 쓰기다.동기적으로 소켓에 쓰기 연산을 하는 메서드와 함수는 실행 중인 스레드를 멈추게 하며, 데이터가 소켓에 쓰이거나 오류를 발생하면 멈춘 스레드를 풀어준다. Boost.asio 라이브러리가 제공하는 가장 기본적은 소켓 쓰기 연산 방법은 write_some() 메서드이다.이 메서드는 결합 버퍼를 나타내는 객체를 인자로 받으며, 이름에서 알 수 있듯이 버퍼의 데이터 일부를 소켓에 쓴다.만약, 메서드가 성공하면 몇 바이트나 썼는지를 반환한다.여기서 중요한 점은 이 메서드가 buffers 인자를 통해 받은 데이..

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

개요데이터가 새로 추가될 때마다 동적으로 크기가 커지는 버퍼를 확장 가능한 버퍼라고 한다.이러한 버퍼는 소켓에서 데이터를 읽을 때 들어오는 메시지의 크기를 알 수 없을 때 주로 사용한다. 어떤 어플리케이션 계층 프로토콜은 메시지의 크기를 정해놓지 않는다.그 대신 메시지의 경계를 나타내는 일련의 기호 값들을 메시지의 끝에 덧붙이거나 전송 계층의 파일 끝 메시지를 전송하여 메시지를 모두 전송했다는 것을 알린다. Boost.asio 라이브러리에서는 동적으로 확장할 수 있는 버퍼와 이를 받는 함수 모두 제공한다.  asio::streambuf확장 가능한 스트림 기반 버퍼는 Boost.asio에서 asio::streambuf 클래스로 표시된다.streambuf 클래스는 TSL 스트림 클래스가 필요한 상황에서도 사..

Boost.asio I/O 고정 크기 버퍼

개요다른 I/O와 마찬가지로, 네트워크 I/O에서도 메모리 버퍼를 사용한다.메모리 버퍼란, 프로세스의 주소 영역 내에 연속된 메모리 공간으로, 데이터를 저장하는데 사용한다. 어떤 입력 연산을 실행했다면, 프로세스에 도착한 데이터는 주소 공간 어딘가에 저장되어야만 처리할 수 있다. 즉, 버퍼가 있어야 I/O를 처리할 수 있다는 것이다. 입력 연산을 실행하기 전에 버퍼를 할당해둬야 하고 입력 연산 중에 데이터를 저장할 곳으로 이 버퍼를 사용해야 한다. 입력 연산이 끝나면, 버퍼에 입력 데이터가 저장되어 있어 나중에 어플리케이션이 처리할 수 있다. 이와 마찬가지로 출력 연산을 실행하기 전에는 데이터를 준비하여 출력 연산에 쓸 출력 버퍼에 저장해둬야 한다. 그러면 출력 버퍼가 데이터의 소스가 된다. 버퍼는 네트..

Boost.asio I/O 연산

개요네트워크 프로그래밍은 컴퓨터 네트워크를 사이에 두고 프로세스가 서로 통신하는 것을 말한다.통신이란 2개 또는 그 이상의 프로세스가 서로 데이터를 주고받는 것을 말한다.데이터를 주고 받는 것은 I/O 연산을 통해서 이루어진다. I/O 연산은 모든 분산 프로그램의 네트워크 구조에서 빼놓을 수 없는 중요 연산이다.I/O 연산은 데이터 교환과 직접 관련된 기능이며, 데이터를 읽을때는 입력, 보낼때는 출력 연산을 사용한다.  동기 I/O 연산동기 연산을 하면 I/O 연산을 호출한 스레드를 멈추게 하며, 연산이 끝날 때 풀어준다.통신에 시간이 많이 걸리지 않는 데이터를 연산을 한다면 괜찮겠지만, 크기가 큰 데이터나 엄청 잦은 데이터 처리를 요구한다고 하면 연산을 처리하는 동안 해당 스레드를 사용할 수 없다. 하..

Boost.asio 소켓 연결 수락

개요클라이언트에서 서버에게 요청 연결을 요청하였다면 서버에서 해당 요청을 수락할 수 있다.다만, 요청을 수락하기 전에 처리해야 할 일이 있으며, 준비가 되지 않았다면 운영체제에서 모든 요청을 거절한다. 먼저 서버 프로그램은 수용자 소켓을 만들고 연 후, 특정 종료점에 바인딩 해야한다.이때 까지 클라이언트가 보내는 연결 요청은 모두 운영체제에서 거절하게 된다.클라이언트의 연결 요청을 받아들이기 위해선 바인딩을 마친 후 리스닝 상태가 되어야 한다.리스닝 상태가 되면 운영체제에서는 클라이언트의 요청을 큐에 저장하고, 연결 요청을 받아들이기 시작한다.  연결 수락 과정새 연결 요청이 도착하면 먼저 운영체제가 받는다.해당 메시지는 연결 요청이 가리키는 수용자 소켓의 대기열에 들어간다.대기열에 있는 연결 요청은 서..

728x90
반응형