-
상속 구조는 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_t
는uv_connect_t
와 동일한 주소(상속관계)는 아니므로, 따로 free가 필요하다.uv_handle_t
를uv_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 안하면 누수 발생한다.