#ifndef __UV_TCPSERVER_H__ #define __UV_TCPSERVER_H__ #pragma once #include <uv.h> #include "mybuf.h" #include "uv_tcp.h" #ifdef __cplusplus extern "C" { #endif typedef struct uv_tcpserver_s uv_tcpserver_t; typedef struct uv_tcpserver_client_context_s uv_tcpserver_client_context_t; typedef void(*uv_tcpserver_on_connection_t)(uv_tcpserver_client_context_t* client, int connected); typedef uv_tcp_parse_result_t(*uv_tcpserver_on_parse_t)(uv_tcpserver_client_context_t* client, const char* buf, size_t len, size_t* ate); typedef void(*uv_tcpserver_on_server_shutdown_t)(uv_tcpserver_t* server); typedef struct uv_tcpserver_settings_s uv_tcpserver_settings_t; int uv_tcpserver_create(uv_tcpserver_t** server, uv_loop_t* loop, uv_tcpserver_settings_t* settings); int uv_tcpserver_start_listen(uv_tcpserver_t* server, const char* listen_addr, int listen_port); void uv_tcpserver_stop(uv_tcpserver_t* server); void uv_tcpserver_free(uv_tcpserver_t* server); void uv_tcpserver_close_cli(uv_tcpserver_client_context_t* cli); // cli must be diconnected already, safe pattern is call this function in callback `on_connect` with `connected = 0` void uv_tcpserver_free_cli_ctx(uv_tcpserver_client_context_t* cli); int uv_tcpserver_send_to_cli(uv_tcpserver_client_context_t* cli, const char* buf, size_t len); struct uv_tcpserver_s { void* data; uv_tcp_t tcp; uv_tcpserver_settings_t* settings; }; struct uv_tcpserver_settings_s { uv_tcpserver_on_connection_t on_connect; uv_tcpserver_on_parse_t on_parse; uv_tcpserver_on_server_shutdown_t on_server_shutdown; }; struct uv_tcpserver_client_context_s { void* data; uv_tcpserver_t* server; uv_tcp_t tcp; mybuf_t buf; }; #ifdef __cplusplus } #endif #endif