반응형

2024/11 77

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와 현재 까지의 ..

[S1] 백준 28107번 회전초밥 C++ 큐

리뷰 https://www.acmicpc.net/problem/28107큐를 20만개를 쓴다는게 메모리 적으로 괜찮은가 생각이 들었지만 제한이 1024MB이므로 그냥 했더니 AC를 받았다.  전역 변수n, m : 손님의 수 n, 요리의 수 mcnt : 손님이 먹은 초밥의 개수를 저장할 정수형 배열q : 각 초밥을 먹고 싶어하는 사람의 큐 배열, 1번 손님부터 우선 순위가 주어진다. 함수없음  문제풀이n, m값을 입력 받고 1번 손님부터 n번 손님까지 반복문을 실행한다.해당 손님이 먹고 싶어하는 초밥의 개수를 정수형 변수 c에 입력받고, c번의 반복문을 실행한다.먹고 싶어하는 초밥의 번호를 정수형 변수 s에 입력 받고, s인덱스 큐에 손님의 번호 i를 추가해 준다.m개의 초밥을 순회하기 위해 m번의 반복문..

[G4] 백준 3078번 좋은 친구 C++ 큐, 슬라이딩 윈도우

리뷰 https://www.acmicpc.net/problem/3078큐를 사용한 간단한 슬라이딩 윈도우 문제  전역 변수n, k : 친구의 수 n, 등수의 최대 차이 klst : 친구의 이름 길이를 저장할 정수형 배열v : 슬라이딩 윈도우 내 각 이름의 길이의 개수를 저장할 정수형 배열ans : 정답을 저장하기 위한 변수, 최악의 경우 30만^2 / 2가 주어질 것 같아 long long타입을 사용했다.q : 슬라이딩 윈도우로 사용할 큐 함수1. inputvoid input() 변수와 배열 초기화를 진행할 함수n, k를 입력 받고 n번의 반복문을 실행한다.친구의 이름 s를 입력 받고, 해당 이름의 길이를 lst배열에 저장해 준다. 2. initvoid init() 초기 슬라이딩 윈도우를 초기화 하기 위..

[G3] 백준 6087번 레이저 통신 C++ 다익스트라, 플러드 필

리뷰 https://www.acmicpc.net/problem/6087맵 상에서 주어지는 두개의 C를 거울을 적절히 배치하여 레이저가 통하도록 하는 문제다익스트라에서 가중치를 거리가 아닌 다른 방식으로 사용하는 것 자체가 신박한 문제였다.  전역 변수w, h : 맵의 가로 길이 w, 맵의 세로 길이 hidx : C를 구분하여 배열에 저장하기 위한 인덱스dx, dy : 4방향 탐색을 위한 방향 배열lst : 맵 정보를 문자열로 받기 위한 문자열 타입 배열Pos : 다익스트라 탐색을 위한 구조체, x, y좌표와 방향을 바꾼 횟수 v, 현재 방향 dir과 cmp함수를 정의한다.C : C의 위치 좌표를 저장하기 위한 Pos타입 배열 함수1. inputvoid input() 변수와 맵 정보를 입력 받고 C정보를 ..

728x90
반응형