[c++] 멀티쓰레드 네트워크 프로그래밍
본 포스트에서는 C++을 사용하여 멀티쓰레드 네트워크 프로그래밍을 다룰 것이다. 우리는 C++11 스탠다드 라이브러리의 std::thread
를 사용하여 멀티쓰레딩을 구현할 것이며, 네트워크 통신을 위해 boost::asio
를 사용할 것이다.
1. 멀티쓰레드 네트워크 서버
먼저, 다음은 C++에서 멀티쓰레드 네트워크 서버를 생성하는 예제이다.
#include <iostream>
#include <thread>
#include <boost/asio.hpp>
using namespace boost::asio;
io_service service;
class TcpConnection : public std::enable_shared_from_this<TcpConnection> {
public:
typedef std::shared_ptr<TcpConnection> pointer;
static pointer create() {
return pointer(new TcpConnection);
}
ip::tcp::socket & socket() {
return socket_;
}
void start() {
// 비동기 읽기/쓰기 작업을 수행
}
private:
ip::tcp::socket socket_;
};
void start_accept(ip::tcp::acceptor & acceptor) {
auto new_connection = TcpConnection::create();
acceptor.async_accept(new_connection->socket(),
[](const boost::system::error_code & ec) {
if (!ec) {
new_connection->start();
}
start_accept(acceptor);
}
);
}
int main() {
ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(), 1234));
start_accept(acceptor);
service.run();
}
위의 코드는 boost::asio
를 사용하여 비동기 소켓 서버를 구현하는 예제이다. io_service
는 비동기 이벤트 루프를 제공하고, async_accept
를 통해 비동기적으로 클라이언트 연결을 받아들이고 각 연결에 대해 새로운 쓰레드를 생성한다.
2. 멀티쓰레드 네트워크 클라이언트
다음은 C++에서 멀티쓰레드 네트워크 클라이언트를 생성하는 예제이다.
#include <iostream>
#include <thread>
#include <boost/asio.hpp>
using namespace boost::asio;
io_service service;
void start_connect(ip::tcp::socket & socket) {
socket.async_connect(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 1234),
[](const boost::system::error_code & ec) {
if (!ec) {
// 연결 성공
}
}
);
}
int main() {
ip::tcp::socket socket(service);
start_connect(socket);
service.run();
}
위의 코드는 boost::asio
를 사용하여 비동기 소켓 클라이언트를 구현하는 예제이다. io_service
를 사용하여 비동기 작업을 처리하고, async_connect
를 통해 서버에 비동기적으로 연결을 시도한다.
이상으로 C++을 사용한 멀티쓰레드 네트워크 프로그래밍에 대한 간단한 예제를 살펴보았다.
참고 자료
- Boost.Asio Documentation: https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio.html
- C++ Thread Support Library: https://en.cppreference.com/w/cpp/thread