반응형

분류 전체보기 626

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 연산을 호출한 스레드를 멈추게 하며, 연산이 끝날 때 풀어준다.통신에 시간이 많이 걸리지 않는 데이터를 연산을 한다면 괜찮겠지만, 크기가 큰 데이터나 엄청 잦은 데이터 처리를 요구한다고 하면 연산을 처리하는 동안 해당 스레드를 사용할 수 없다. 하..

[G3] 백준 16637번 괄호 추가하기 C++ 구현, 백트래킹

리뷰 https://www.acmicpc.net/problem/16637주어지는 연산자가 포함된 문자열로 이루어진 수열에서 괄호를 적절히 쳐서 최대값을 만드는 문제처음엔 모든 경우에 대해 괄호를 씌워주었는데, 괄호가 중첩되면 안된다는 조건이 있었다.추가로, 음수 정답이 나오는 예제가 없으니 해당 부분을 놓치기 쉬운 것 같다.  전역 변수n : 입력되는 수열 형태의 문자열의 길이max_lv : 재귀를 멈출 기저조건에 해당하는 레벨ans : 정답을 출력하기 위한 변수, 초기값은 매우 작은 음수값으로 초기화 해준다.s : 수열 형태의 문자열을 입력받을 변수nums : 수열에서 숫자만 따로 저장하기 위한 정수형 벡터ops : 수열에서 연산자만 따로 저장하기 위한 문자형 벡터 함수1. initvoid init()..

Boost.asio 소켓 연결 수락

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

Boost.asio 소켓 연결 요청

개요TCP 소켓으로 원격 어플리케이션과 통신을 시작하려면 먼저 논리적 연결을 수립해야 한다.TCP 프로토콜의 연결 수립이란 두 프로그램 사이에서 메시지를 주고 받는것을 의미한다.이것이 성공해야 두 프로그램이 연결된 것으로 간주할 수 있고, 통신을 할 수 있는 준비가 끝난다. 연결 수립 과정을 간단하게 설명하면 다음과 같다.서버 프로그램과 통신하기 원하는 클라이언트 프로그램이 존재클라이언트가 능동 소켓을 생성하고 연 후 connect() 명령을 내림이때 종료점 객체를 통해 원하는 대상 서버프로그램을 명시함네트워크 연결을 통해 연결 수립 요청 메시지를 서버 프로그램으로 전송요청을 받은 서버 프로그램은 자기가 사용할 능동 소켓을 만듦클라이언트와 연결 됐음을 표시하고 이를 클라이언트에 알림(ACK 전달)클라이언..

Boost.asio 소켓 바인딩

개요능동 소켓으로 원격 프로그램과 통신하거나 수동 소켓으로 들어오는 연결 요청을 받으려고 하기 전에, 소켓은 실제 IP 주소와 프로토콜 포트 번호, 즉 종료점에 묶어야 한다.소켓을 특정 종료점과 묶는 과정을 바인딩이라고 한다. 소켓이 종료점에 바인딩 되면, 운영체제가 네트워크에서 호스트의 해당 종료점으로 들어오는 모든 네트워크 패킷을 특정 소켓으로 전달한다.이와 반대로 종료점에 연결된 소켓에서 나가는 모든 데이터는 종료점이 나타내는 IP 주소의 네트워크로 송출된다. 클라이언트 프로그램은 자신의 능동 소켓과 바인딩할 IP 주소 및 프로토콜 포트 번호에 크게 신경쓰지 않지만, 서버 프로그램은 특정 종료점을 명시적으로 자신의 수용자 소켓과 바인딩해야 한다.서버의 종료점은 자신과 통신하기를 원하는 클라이언트가 ..

Boost.asio DNS 이름 해석하기

개요원시 IP 주소는 사람이 기억하기 매우 불편하다. 특히 16진수를 사용하는 IPv6의 경우에는 더욱 그렇다.숫자들과 낱말들이 의미 없이 나열된 문자열을 기억한다는 것은 보통 일이 아니다. 네트워크에 있는 기기에 사람이 기억하기 쉬운 이름을 붙여주기 위해 DNS를 사용한다.www.naver.com이나 www.google.com과 같은 링크는 쉽게 기억할 수 있는 이유이다. DNS는 하나 또는 그 이상의 IP 주소에 대한 별칭이다.DNS가 가리키는 IP 주소가 무엇인지 물어볼 수 있도록 하는 인터페이스를 제공한다.DNS의 이름을 IP 주소로 바꾸는 과정을 DNS 이름 해석이라고 부른다.  DNS 이름 해석기 (resolver)서버 프로그램을 가르키는 DNs 이름과 프로토콜 포트 번호를 얻고 문자열로 표현..

Boost.asio 능동/수동 소켓 만들기

개요TCP/IP 표준에서는 소켓을 언급하지 않는다, API를 어떻게 구현해야 하는지에 대해서도 나와 있지 않다.따라서 TCP 프로토콜 소프트웨어를 개발하는 모든 개발자는 자신만의 프로토콜 구현용 인터페이스를 마음대로 만들 수 있다. (UDP 프로토콜도 동일하다.) 가장 널리 사용되는 TCP/UDP 프로토콜 API는 버클리 소켓이다.버클리 소켓 API는 통신 세션 문맥을 나타내는 소켓을 중심에 둔 디자인이다.어떠한 네트워크 I/O 연산이든, 시작하기 전에 소켓 객체를 할당해야 하고, 그런 다음 소켓과 개별 I/O 연산을 해야한다. Boost.asio는 버클리 소켓 API에서 많은 개념을 빌려왔다.  능동 소켓원격 어플리케이션으로 데이터를 보내고 받거나 연결 수립 과정을 시작하는데 사용하는 소켓 asio::..

Boost.asio 종료점 만들기

개요일반적인 클라이언트 어플리케이션이 서비스를 제공하는 서버 프로그램과 통신하려면, 서버 프로그램이 실행되고 있는 호스트의 IP 주소와 프로토콜 포트 번호를 알아야 한다.IP 주소와 프로토콜 포트 번호라는 한 쌍의 값으로 네트워크상의 특정 호스트에서 실행되고 있는 한 프로그램을 지정할 수 있다.그런 한 쌍의 값을 종료점이라고 부른다. 일반적으로 서버 프로그램의 IP 주소와 포트 번호를 사용자로부터 직접 입력 받거나, 프로그램의 구성 파일에서 알아낸다.IP주소가 IPv4라면, 숫자와 마침표로 이뤄진 문자열로 표시한다.IPv6라면 16진법에 따른 문자열로 표시한다.서버 IP 주소는 DNS를 통해 좀 더 간접적으로 표시하기도 한다. 클라이언트 뿐만 아니라 서버 프로그램 역시 종료점을 다뤄야 한다.서버 프로그램..

728x90
반응형