MinimalSocket은 완전히 플랫폼에 구애받지 않는 방식으로 tcp 및 udp 소켓 연결을 설정하고 생성할 수 있는 최신 C++ 라이브러리를 제공합니다. 지원되는 시스템은 Windows , 모든 Linux 배포판 및 MacOS 입니다.
기능 섹션에서는 MinimalSocket 의 다양한 기능을 자세히 설명합니다. MinimalSocket을 사용하는 것이 얼마나 쉬운지 알아보려면 사용법 및 샘플을 읽어보세요.
이것은 CMake 프로젝트입니다. CMake 지원을 확인하여 이 라이브러리가 어떻게 통합될 수 있는지 알아보세요.
이 라이브러리가 유용하다고 생각되면 별표를 남겨 두십시오.
아직 별을 떠나지 않으셨나요? 지금 해보세요 ;)!
MinimalSocket을 사용하면 tcp 및 udp 연결을 구축하고 설정할 수 있습니다. 메시지는 바이트 버퍼 또는 문자열 버퍼 측면에서 전송 및 수신될 수 있습니다. 실제로 이것은 실제로 소켓에 필요한 유일한 기능입니다. 특히 Google 프로토콜 버퍼 또는 NanoPb와 같은 접근 방식을 사용하여 더 복잡한 메시지를 바이트 버퍼에서 직렬화하거나 내부화할 수 있기 때문입니다.
MinimalSocket 의 가장 주목할만한 특징은 다음과 같습니다.
이 표에는 MinimalSocket을 사용하여 생성할 수 있는 소켓의 차단 동작과 비차단 동작 간의 차이점이 요약되어 있습니다.
차단 동작, 호출자는 완료 또는 시간 초과에 도달할 때까지 차단됩니다(지정된 경우). | 비차단 동작, 함수가 즉시 반환됨 | |
---|---|---|
새 클라이언트 수락(tcp만 해당) | 호출자 스레드는 새 클라이언트가 실제로 연결을 요청하거나 시간 초과에 도달할 때까지 흡수됩니다(지정된 경우). | accept 함수를 호출하기 전에 클라이언트의 연결 요청이 이미 대기열에 있으면 새 연결 핸들러가 반환되고, 그렇지 않으면 nullopt가 반환됩니다. |
새 메시지 수신(tcp 및 udp) | 호출자 스레드는 새로운 메시지가 소켓으로 전송되거나 시간 제한에 도달할 때까지 흡수됩니다(지정된 경우). | 수신 함수를 호출하기 전에 메시지가 전송되어 이미 소켓 버퍼의 대기열에 있는 경우 해당 메시지가 반환되고, 그렇지 않으면 빈 메시지가 반환됩니다. |
새 메시지 보내기(tcp 및 udp) | 소켓의 버퍼가 가득 차지 않고 보낼 메시지를 완전히 호스팅할 수 있는 경우 메시지는 실제로 버퍼에 기록되고 함수는 거의 즉시 반환됩니다. 반대로 호출자 스레드는 버퍼에 공간이 채워질 때까지 흡수되고(메시지가 상대방에서 소비됨에 따라) 그 후에 메시지가 실제로 작성되고 함수가 완료됩니다. | 소켓의 버퍼에 충분한 공간이 있으면 메시지가 기록되고 함수가 반환됩니다. 반대의 경우 실제로 메시지를 보내지 않고 즉시 함수가 반환됩니다. (나중에 보내기를 다시 시도할 수 있습니다.) |
아직 별을 떠나지 않으셨나요? 지금 해보세요 ;)!
전통적인 차단 TCP 서버를 생성하려면 tcp::TcpServer 객체를 구축하기만 하면 됩니다:
# include < MinimalSocket/tcp/TcpServer.h >
MinimalSocket::Port port = 15768 ; // the port to bind
MinimalSocket::tcp::TcpServer< true > tcp_server (
port, MinimalSocket::AddressFamily::IP_V4);
열어보세요:
// open the server: binds the port and start to listen on the port
bool success = tcp_server.open();
이제 새로운 고객을 받아들일 준비가 되었습니다.
// accepts the next client that will ask the connection
MinimalSocket::tcp::TcpConnectionBlocking accepted_connection =
tcp_server.acceptNewClient(); // blocking till a client actually asks the
// connection
이제 다음과 같이 간단하게 수락된 클라이언트와 메시지를 교환할 수 있습니다.
// receive a message
std:: size_t message_max_size = 1000 ;
std::string
received_message // resized to the nunber of bytes actually received
= accepted_connection.receive(message_max_size);
// send a message
accepted_connection.send( " a message to send " );
대신 비차단 서버가 필요한 경우 비슷한 방법으로 만들 수 있습니다.
MinimalSocket::Port port = 15768 ; // the port to bind
MinimalSocket::tcp::TcpServer< false > tcp_server (
port, MinimalSocket::AddressFamily::IP_V4);
tcp_server.open();
이 서버 버전은 비차단 버전입니다. 즉, accept 함수가 즉시 반환됩니다.
// check if a client asked for the connection. If no, the function immediately
// returns a nullopt. On the contrary, the returned optional contains the
// handler to the connected client
std::optional<MinimalSocket::tcp::TcpConnectionBlocking>
maybe_accepted_connection = tcp_server.acceptNewClient();
서버 자체는 차단하지 않더라도 최종적으로 승인된 클라이언트 처리기는 차단됩니다. 소켓을 비차단 처리기로 전송하여 비차단 소켓으로 전환할 수도 있습니다.
MinimalSocket::tcp::TcpConnectionNonBlocking accepted_connection_nn_block =
maybe_accepted_connection-> turnToNonBlocking ();
tcp 클라이언트를 생성하려면 tcp::TcpClient 개체를 빌드하기만 하면 됩니다.
# include < MinimalSocket/tcp/TcpClient.h >
MinimalSocket::Port server_port = 15768 ;
std::string server_address = " 192.168.125.85 " ;
MinimalSocket::tcp::TcpClient< true > tcp_client (
MinimalSocket::Address{server_address, server_port});
열어보세요:
// Open the server. Here, the client will ask the connection to specified
// server. After that, the client will be actually connected.
bool success =
tcp_client.open(); // blocking till the connection is actually established
이제 다음과 같이 간단하게 원격 서버와 정보를 주고받을 수 있습니다.
// send a message
tcp_client.send( " a message to send " );
// receive a message
std:: size_t message_max_size = 1000 ;
std::string
received_message // resized to the nunber of bytes actually received
= tcp_client.receive(message_max_size);
대신 비차단 클라이언트가 필요한 경우 비슷한 방식으로 생성하여 사용할 수 있습니다.
MinimalSocket::Port server_port = 15768 ;
std::string server_address = " 192.168.125.85 " ;
MinimalSocket::tcp::TcpClient< false > tcp_client (
MinimalSocket::Address{server_address, server_port});
tcp_client.open();
std:: size_t message_max_size = 1000 ;
// non blocking receive: returns immediately with an empty message in case no
// new data were available, or with a non empty message in the contrary case
std::string received_message = tcp_client.receive(message_max_size);
일반 UDP 소켓을 생성하려면 udp::Udp 개체를 빌드하면 됩니다.
# include < MinimalSocket/udp/UdpSocket.h >
MinimalSocket::Port this_socket_port = 15768 ;
MinimalSocket::udp::Udp< true > udp_socket (this_socket_port,
MinimalSocket::AddressFamily::IP_V6);
열어보세요:
// Open the server. This will bind the specified port.
bool success = udp_socket.open();
이제 다른 UDP 소켓을 사용하여 정보를 주고받을 수 있습니다.
// send a message to another udp
MinimalSocket::Address other_recipient_udp =
MinimalSocket::Address{ " 192.168.125.85 " , 15768 };
udp_socket.sendTo( " a message to send " , other_recipient_udp);
// receive a message from another udp reaching this one
std:: size_t message_max_size = 1000 ;
auto received_message = udp_socket.receive(message_max_size);
// check the sender address
MinimalSocket::Address other_sender_udp = received_message->sender;
// access the received message
std::string received_message_content // resized to the nunber of bytes
// actually received
= received_message->received_message;
열린 UDP 소켓을 특정 주소에 "연결"하도록 결정할 수도 있습니다. 이는 UDP 소켓이 연결 지향적이지 않기 때문에 다른 피어로부터 들어오는 메시지가 필터링된다는 의미일 뿐입니다.
MinimalSocket::Address permanent_sender_udp =
MinimalSocket::Address{ " 192.168.125.85 " , 15768 };
MinimalSocket::udp::UdpConnected< true > udp_connected_socket =
udp_socket.connect(
permanent_sender_udp); // ownership of the underlying socket is
// transfered from udp_socket to
// udp_connected_socket, meaning that you can't
// use anymore udp_socket (unless you re-open
// it)
이제 수신자/발신자를 지정하지 않고도 데이터를 보내고 받을 수 있습니다.
// receive a message
std:: size_t message_max_size = 1000 ;
std::string
received_message // resized to the nunber of bytes actually received
= udp_connected_socket.receive(message_max_size);
// send a message
udp_connected_socket.send( " a message to send " );
비차단 UDP 소켓을 생성하고 사용할 수도 있습니다.
MinimalSocket::Port this_socket_port = 15768 ;
MinimalSocket::udp::Udp< false > udp_socket (
this_socket_port, MinimalSocket::AddressFamily::IP_V6);
udp_socket.open();
std:: size_t message_max_size = 1000 ;
// non blocking receive: returns immediately with an empty message in case no
// new data were available, or with a non empty message in the contrary case
//
// struct ReceiveStringResult {
// Address sender;
// std::string received_message;
// };
std::optional<MinimalSocket::ReceiveStringResult> received_message =
udp_socket.receive(message_max_size);
아직 별을 떠나지 않으셨나요? 지금 해보세요 ;)!
TCP 소켓에 대한 사용 예는 여기에서 찾을 수 있으며, UDP 샘플은 여기에서 설명합니다.
주목!!! 처음에는 방화벽에 의해 샘플 실행이 차단될 수 있습니다. 방화벽을 올바르게 설정하거나 관리자 권한으로 샘플을 실행하세요.
아직 별을 떠나지 않으셨나요? 지금 해보세요 ;)!
이 라이브러리를 사용하려면 CMake를 사용할 수 있습니다. 보다 정확하게는 이 패키지를 가져와 MinimalSocket 라이브러리에 연결할 수 있습니다.
include (FetchContent)
set (BUILD_MinimalCppSocket_SAMPLES OFF CACHE BOOL "" FORCE) # you don't want the samples in this case
FetchContent_Declare(
min_sock
GIT_REPOSITORY https://github.com/andreacasalino/Minimal-Socket
GIT_TAG master
)
FetchContent_MakeAvailable(min_sock)
그런 다음 MinimalSocket 라이브러리에 연결합니다.
target_link_libraries ( ${TARGET_NAME}
MinimalSocket
)
모든 시스템 관련 모듈은 내부에 포함되어 있으며 노출되지 않습니다. 또한 Windows 에서는 wsock32 및 ws2_32가 비공개로 연결되므로 MinimalSocket을 사용할 때 다시 연결할 필요가 없습니다.