반응형

소켓 통신 29

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

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

소켓 통신/Boost 2024.11.18

Boost.asio 동기 UDP 클라이언트

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

소켓 통신/Boost 2024.11.18

Boost.asio 동기 TCP 클라이언트

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

소켓 통신/Boost 2024.11.18

Boost.asio 클라이언트 개요

개요클라이언트는 서버와 통신하는 어플리케이션이며, 서버가 제공하는 서비스를 사용한다.서버가 제공하는 서비스가 필요하다는 점과 그 서비스를 받기 위해 서버와의 통신을 시작하는 것이 특징이다. 클라이언트 어플리케이션은 서버와 통신할 때 사용하는 전송 계층 프로토콜로 나눌 수 있다.UDP 프로토콜을 쓴다면 UDP 클라이언트다.TCP 프로토콜을 쓴다면 TCP 클라이언트다.물론 클라이언트가 쓸 수 있는 전송 계층 프로토콜은 다른 것도 많다.게다가 여러 가지 프로토콜을 사용해 통신할 수 있는 다중 프로토콜 클라이언트도 있다.하지만 일반적으로 소프트웨어에서 가장 널리 쓰이는 프로토콜은 UDP와 TCP이다. 프로그램을 명세에 따라 설계하는 초기 단계에서 통신 시 사용할 전송 계층 프로토콜을 결정해야 한다.TCP와 UD..

소켓 통신/Boost 2024.11.14

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

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

소켓 통신/Boost 2024.11.14

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 2024.11.14

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

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

소켓 통신/Boost 2024.11.14

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

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

소켓 통신/Boost 2024.11.14

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

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

소켓 통신/Boost 2024.11.08

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

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

소켓 통신/Boost 2024.11.08
728x90
반응형