동기화된 교체형 TCP 서버 구현
1. 관련 정의
2. 기본 프로세스
3. 소스 코드 구현
//Compile: g++ -std=c++11 -o server Server.cc -lboost_system -lpthread
#include <boost/asio.hpp>
#include <thread>
#include <atomic>
#include <memory>
#include <iostream>
using namespace boost;
class Service {
public:
Service() = default;
void HandleClient(asio::ip::tcp::socket &sock) {
try {
asio::streambuf request;
asio::read_until(sock, request, '
');
// Emulate request processing
int i = 0;
while (i != 1000000)
++i;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
// Sending response
std::string response = "Response
";
asio::write(sock, asio::buffer(response));
} catch (const system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code()
<< ". Message: " << e.what();
}
}
};
class Acceptor {
public:
Acceptor(asio::io_service &ios, unsigned short port_num)
: ios_(ios), acceptor_(ios_, asio::ip::tcp::endpoint(
asio::ip::address_v4::any(),
port_num))
{
acceptor_.listen();
}
void Accept() {
asio::ip::tcp::socket sock(ios_);
acceptor_.accept(sock);
Service srv;
srv.HandleClient(sock);
}
private:
asio::io_service &ios_;
asio::ip::tcp::acceptor acceptor_;
};
class Server {
public:
Server() : stop_(false) { }
void Start(unsigned short port_num) {
thread_.reset(new std::thread([this, port_num] {
Run(port_num);
}));
}
void Stop() {
stop_.store(true);
thread_->join();
}
private:
void Run(unsigned short port_num) {
Acceptor acc(ios_, port_num);
while (!stop_.load()) {
acc.Accept();
}
}
std::unique_ptr<std::thread> thread_;
std::atomic<bool> stop_;
asio::io_service ios_;
};
int main()
{
unsigned short port_num = 2333;
try {
Server srv;
srv.Start(port_num);
std::this_thread::sleep_for(std::chrono::seconds(600));
srv.Stop();
} catch (const system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code() << ". Message: "
<< e.what();
}
return 0;
}
4. 결함 및 해결 방안
솔루션:
stop
솔루션:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
k8spacket 및 Grafana를 통한 kubernetes용 TCP 패킷 트래픽 시각화보고 있지 않을 때 k8s 클러스터가 무엇을 하는지 알고 있습니까? 누가 그와 TCP 통신을 설정합니까? k8spacket 및 Grafana 를 사용하여 클러스터의 TCP 트래픽을 시각화할 수 있습니다. 설정된 연결...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.