服務(wù)器端的建立流程如下
- uv_tcp_init建立tcp句柄。
- uv_tcp_bind綁定钦铺。
- uv_listen建立監(jiān)聽(tīng)订雾,當(dāng)有新的連接到來(lái)時(shí),激活調(diào)用回調(diào)函數(shù)矛洞。
- uv_accept接收鏈接洼哎。
- 使用stream處理來(lái)和客戶端通信。
uv_tcp_bind
- uv_tcp_t* handle
- sockaddr* addr 代表端口號(hào)和ip地址的結(jié)構(gòu)體
- flags 使用ipv4的時(shí)候傳遞0沼本,使用ipv6的時(shí)候用uv_tcp_flags的UV_TCP_IPV6ONLY 也就是1
uv_listen
- uv_stream_t* stream 雙工通道的抽象類噩峦,有三個(gè)實(shí)現(xiàn)
uv_tcp_t
,uv_pipe_t
和uv_tty_t
. - int backlog 表示accept queue的大小,如果達(dá)到這個(gè)值抽兆,server將發(fā)送一個(gè)ECONNREFUSED錯(cuò)誤信息识补。實(shí)際操作中,內(nèi)核會(huì)根據(jù)傳入的backlog參數(shù)與系統(tǒng)參數(shù)somaxconn郊丛,取二者的較小值
- uv_connection_cb 回調(diào)函數(shù)
uv_accept
- uv_stream_t* server
- uv_stream_t* client
uv_read_start
- uv_stream_t* client
- uv_alloc_cb alloc_cb 為每個(gè)數(shù)據(jù)包分配內(nèi)存
- uv_read_cb read_cb 讀取數(shù)據(jù)后的回調(diào)函數(shù)
回調(diào)函數(shù)uv_alloc_cb
參數(shù):
- uv_handle_t *handle 與客戶端建立的鏈接的句柄
- size_t suggested_size 估計(jì)的數(shù)據(jù)包的大小
- uv_buf_t *buf 數(shù)據(jù)存放的位置
typedef struct uv_buf_t {
char* base;
size_t len;
} uv_buf_t;
回調(diào)函數(shù) uv_read_cb
參數(shù):
- uv_stream_t *client 與客戶端建立的鏈接句柄
- ssize_t nread 本次讀取數(shù)據(jù)的大小
- uv_buf_t *buf 數(shù)據(jù)存放位置
這里需要注意buf用完后要手動(dòng)free掉李请,不要
uv_buf_init函數(shù)只把指針拷貝到結(jié)構(gòu)體中瞧筛,沒(méi)有復(fù)制里面的內(nèi)容。詳見(jiàn):https://stackoverflow.com/questions/38081423/libuv-and-uv-buf-init-who-should-free-what