[c++] libuv의 네트워킹 기능

libuv는 Node.js의 이벤트 기반 및 비동기 I/O 라이브러리이지만 기본적인 네트워킹에 대한 기능도 제공합니다. libuv를 사용하여 네트워킹을 구현하는 방법에 대해 알아봅시다.

TCP 서버 만들기

libuv를 사용하여 TCP 서버를 만들려면 다음과 같이 작성할 수 있습니다.

#include <uv.h>
#include <iostream>

uv_tcp_t server;

void on_new_connection(uv_stream_t* server, int status) {
    if (status < 0) {
        std::cerr << "New connection error: " << uv_strerror(status) << std::endl;
        return;
    }

    uv_tcp_t* client = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));
    uv_tcp_init(uv_default_loop(), client);
    if (uv_accept(server, (uv_stream_t*)client) == 0) {
        // 클라이언트와의 통신을 처리하는 코드
    } else {
        uv_close((uv_handle_t*)client, NULL);
    }
}

int main() {
    uv_loop_t* loop = uv_default_loop();

    uv_tcp_init(loop, &server);
    struct sockaddr_in addr;
    uv_ip4_addr("0.0.0.0", 8888, &addr);
    uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);

    int r = uv_listen((uv_stream_t*)&server, 128, on_new_connection);
    if (r) {
        std::cerr << "Listen error: " << uv_strerror(r) << std::endl;
        return 1;
    }

    return uv_run(loop, UV_RUN_DEFAULT);
}

위의 코드는 libuv를 사용하여 기본적인 TCP 서버를 만드는 예제입니다. uv_tcp_t를 사용하여 새로운 TCP 서버를 초기화하고, uv_listen 함수를 사용하여 새로운 연결을 수락하고 처리합니다.

TCP 클라이언트 만들기

libuv를 사용하여 TCP 클라이언트를 만들려면 다음과 같이 작성할 수 있습니다.

#include <uv.h>
#include <iostream>

uv_tcp_t socket;
uv_connect_t connect_req;

void on_connect(uv_connect_t* req, int status) {
    if (status < 0) {
        std::cerr << "Connect error: " << uv_strerror(status) << std::endl;
        return;
    }

    // 서버와의 통신을 처리하는 코드
}

int main() {
    uv_loop_t* loop = uv_default_loop();

    uv_tcp_init(loop, &socket);
    uv_connect(&connect_req, &socket, (const sockaddr*)&server_addr, on_connect);

    return uv_run(loop, UV_RUN_DEFAULT);
}

위의 코드는 libuv를 사용하여 기본적인 TCP 클라이언트를 만드는 예제입니다. uv_tcp_t를 사용하여 새로운 TCP 소켓을 초기화하고, uv_connect 함수를 사용하여 서버에 연결합니다.

libuv를 사용하여 네트워킹 기능을 추가할 때 언급된 함수에 대한 더 자세한 정보는 libuv 공식 문서를 참조하시기 바랍니다.