• 상속 구조는 uv_handle_t uv_tcp_t uv_stream_t 이다. 즉 uv_handle_t가 부모

    그래서 보통 uv_stream_t를 uv_tcp_t나 uv_handle_t로 형변환 하는 경우는 가능하지만, uv_handle_t를 uv_stream_t로 형변환 하는건 불가하다.

    다만, 주소값은 동일하므로, free는 어떤 걸로 해도 가능하다

  • uv_handle_tuv_connect_t와 동일한 주소(상속관계)는 아니므로, 따로 free가 필요하다.

    uv_handle_tuv_connect_t 각각 다른 구조체로 관리하는 경우 둘다 free가 되야한다.

  • uv_handle_t 구조체의 data 필드는 사용자가 직접 할당할 수 있는 부분이다.

    이벤트 루프에서 사용자의 필요한 정보를 힙영역에 할당하고 data 필드에 해당 영역에 포인터 주소값을 할당해주는 식으로 활용할 수 있다.

    (uv_handle_t를 상속 받는 구조체를 포함한 대부분에 것들에서 data 필드가 사용가능하다)

  • uv_shutdown()는 되도록 쓰지 말자.

    uv_shutdown은 해당 소켓에 fin 플래그 (UV_EOF)를 전송하는데 문제는 가끔 씹히는 경우가 있거나, 해당 소켓이 읽기 (Read 로직)를 수행하지 않는경우 동작하지 않아 소켓이 종료 되지 않고 좀비화 되어 메모리를 점유하는 문제가 있다.

    따라서 그냥 uv_close()로 연결 끊자.

  • 버퍼를 uv_write()로 전달하려면 uv_buf_init()을 필수로 수행하자.

    실제 보낸 데이터 범위를 지정하지 못해 쓰레기 데이터가 전송될 가능성이 있으므로 두번째 인자인 len에 범위를 정확히 입력하여 버퍼를 초기화 하자.

  • read_data 콜백에 buf는 nread <= 0라도 무조건 free 해야한다.

    nread 가 0인 상태에서도 alloc_buffer는 기본적으로 64KB 수준의 버퍼를 할당하기 때문에 free 안하면 누수 발생한다.