반응형

2024/11/18 7

Boost.asio 반복 동기 TCP 서버

개요반복적 동기 TCP 서버는 다음과 같은 사항을 만족시키는 분산 어플리케이션이다.클라이언트 서버 통신 모델에서 서버로 동작한다.TCP 프로토콜을 사용해 클라이언트 프로그램과 통신한다.I/O 및 제어 연산을 하는 동안에는 연산이 끝나거나 오류가 발생할 때까지 실행 스레드를 멈춘다.클라이언트를 한 번에 하나씩 처리한다.일반적인 동기 TCP 서버는 다음과 같은 알고리즘에 따라 동작한다.수용자 소켓을 할당하고 특정 TCP 포트에 묶는다.서버가 중단될 때까지 루프를 돈다.클라이언트로부터 연결 요청이 오기를 기다린다.연결 요청이 오면 받아들인다.클라이언트로부터 요청 메시지가 오기를 기다린다.요청 메시지를 읽는다.요청을 처리한다.클라이언트에게 응답 메시지를 보낸다.클라이언트와의 연결을 닫고 소켓을 할당 해지한다. ..

Boost.asio 서버 개요

개요서버는 분산 어플리케이션의 반대쪽 부분인 클라이언트에게 받을 서비스를 제공하는 역할을 맡는다.그리고 클라이언트는 서버가 제공하는 서비스를 받기 위해 서버와 통신한다. 일반적으로 서버는 클라이언트-서버 통신 과정에서 수동적인 역할을 한다.서버는 호스트의 포트에 붙고, 그 포트로 클라이언트가 요청을 보내지 않는지 기다린다.요청이 도착하면 서버는 자신이 제공하는 서비스에 맞춰 동작한다. 서버가 제공하는 서비스에 따라 요청 처리 과정도 매우 다르다.예를 들어, HTTP 서버라면 대체로 요청 메시지에서 원한 파일 내용을 읽어 클라이언트로 보낸다.프록시 서버라면 클라이언트의 요청을 실제로 처리할 다른 서버로 전달한다.좀 더 구체적인 서버들이라면 클라이언트가 제공한 데이터에 대해 복잡한 계산을 거쳐 그 결과를 클..

Boost.asio 비동기 멀티 스레드 TCP 클라이언트

개요클라이언트가 수백 만개의 요청을 만들 수 있고, 최대한 빠르게 처리하고 싶다면, 다중 스레드를 지원해야한다.그러면 여러개의 스레드가 진짜로 동시에 여러 요청을 처리할 수 있다.물론, 클라이언트가 실행되는 컴퓨터에 프로세서가 여러 개 있어야 한다.만약, 컴퓨터에 설치된 프로세서의 수보다 더 많은 스레드를 동시에 실행시키면 스레드 교환에 따른 부하 때문에 어플리케이션의 속도가 오히려 떨어질 수도 있다. 단일 스레드와의 차이는 클래스 인스턴스를 생성할 때 생성자에 생성할 스레드의 개수를 전달한다.해당 정수를 통해 전달한 크기 만큼의 스레드를 생성하여 작업을 병렬처리 할 수 있다.I/O 연산을 하는 부분은 단일 스레드와 큰 차이가 없으므로 하기 글을 참고하길 바란다. Boost.asio 비동기 단일 스레드 ..

Boost.asio 비동기 단일 스레드 TCP 클라이언트

개요가장 간단한 비동기 클라이언트라 하더라도 동기 클라이언트에 비해 구조적으로 복잡하다.비동기 클라이언트에 요청 취소와 같은 기능을 추가하려면 좀 더 복잡해진다.비동기 TCP 클라이언트가 갖춰야 할 사항은 다음과 같다.서버에서 오는 입력을 처리하는 스레드를 따로 둔다.(사용자 인터페이스 스레드)위 스레드는 눈에 띄게 긴 시간 동안 멈추는 일이 없어야 한다.사용자가 다양한 서버로 여러 요청을 보낼 수 있어야 한다.사용자가 요청을 보낸 후 완료되기 전에 취소할 수 있어야 한다. 비동기 TCP 클라이언트 구현#include // OS 식별 도구// Windows XP, Windows Server 2003 이하에서 I/O 작업 취소 기능을 활성화하기 위해 필요// 자세한 내용은 "http://www.boost..

Boost.asio 동기 UDP 클라이언트

개요동기 UDP 클라이언트는 다음과 같은 사항을 만족시키는 분산 어플리케이션이다.클라이언트 서버 통신 모델에서 클라이언트로 동작한다.UDP 프로토콜을 사용해 서버 프로그램과 통신한다.I/O 및 제어 연산을 하는 동안에는 연산이 끝나거나 오류가 발생할 때까지 실행 스레드를 멈춘다.일반적인 동기 UDP 클라이언트는 다음과 같은 알고리즘에 따라 동작한다.클라이언트 프로토콜이 통신할 각 서버 프로그램의 IP 주소와 프로토콜 포트 번호를 알아낸다.UDP 소켓을 할당한다.서버들과 메시지를 주고 받는다.소켓을 할당 해지한다. 동기 UDP 클라이언트 구현#include #include using namespace boost;class SyncUDPClient {public: SyncUDPClient() : ..

Boost.asio 동기 TCP 클라이언트

개요서버 프로그램은 아스키 문자열로 표현된 요청을 받는다, 요청 문자열의 형식은 다음과 같다.EMULATE_LONG_COMP_OP [s] 여기서 [s]는 양수를, 는 아스키로 개행 문자를 나타낸다.서버는 이 문자열을 [s]초 동안 무의미한 연산을 실행해달라는 요청으로 해석한다. "EMULATE_LONG_COMP_OP 10\n" 위와 같은 문자열이 서버에 요청으로 들어왔다고 가정한다면, 서버는 클라이언트가 10초간 무의미한 연산을 한 후 응답을 보내달라고 요청한 것으로 생각한다. 클라이언트의 요청과 마찬가지로, 서버가 보내는 응답도 아스키 문자열로 표현된다.연산이 성공한다면 OK를, 실패한다면 ERROR를 보낸다.  동기 TCP 클라이언트 구현동기 TCP 클라이언트는 다음과 같은 사항을 만족시키는 분산 어..

[G4] 백준 1967번 트리의 지름 C++ DFS, 트리

리뷰 https://www.acmicpc.net/problem/1967간선의 가중치가 있는 트리에서 가장 먼 노드끼리의 길이를 구하면 트리의 지름이 된다.유사문제로는 BOJ 1167번이 있다.https://www.acmicpc.net/problem/1167  전역 변수n : 노드의 개수v : 방문 처리 배열Edge : 간선을 나타낼 구조체, 다음 노드 nxt와 가중치 val값을 가진다.lst : 인접 리스트를 저장할 Edge타입 2차 벡터result : 시작 노드로 부터 가장 먼 노드와 그 때의 가중치를 저장할 정수형 2개의 pair 함수1. dfsvoid dfs(int node, int val) 깊이 우선 탐색을 통해 트리의 지름을 구하기 위한 함수매개변수로 탐색을 진행할 노드 node와 현재 까지의 ..

728x90
반응형