1. 所在的结构体定义
struct mg_server {
sock_t listening_sock;
union socket_address lsa; // Listening socket address
struct ll active_connections;
struct ll uri_handlers;
char *config_options[NUM_OPTIONS];
void *server_data;
void *ssl_ctx; // SSL context
sock_t ctl[2]; // Control socketpair. Used to wake up from select() call
};
2. 变量赋值
mg_create_server函数: server->server_data = server_data;
3. 内部使用,转化为server_param
accept_new_connection函数 conn->mg_conn.server_param = server->server_data; LINKED_LIST_ADD_TO_FRONT(&server->active_connections, &conn->link);
4. server_param所在的结构体定义
// This structure contains information about HTTP request.
struct mg_connection {
const char *request_method; // "GET", "POST", etc
const char *uri; // URL-decoded URI
const char *http_version; // E.g. "1.0", "1.1"
const char *query_string; // URL part after '?', not including '?', or NULL
char remote_ip[48]; // Max IPv6 string length is 45 characters
int remote_port; // Client's port
int num_headers; // Number of HTTP headers
struct mg_header {
const char *name; // HTTP header name
const char *value; // HTTP header value
} http_headers[30];
char *content; // POST (or websocket message) data, or NULL
int content_len; // content length
int is_websocket; // Connection is a websocket connection
int status_code; // HTTP status code for HTTP error handler
unsigned char wsbits; // First byte of the websocket frame
void *server_param; // Parameter passed to mg_add_uri_handler()
void *connection_param; // Placeholder for connection-specific data
};
5. Demo举例使用
multi_threaded.c文件中创建mg_create_server时传入参数: server1 = mg_create_server((void *) "1");
设置uri处理函数: mg_add_uri_handler(server1, "/", request_handler);
在request_handler回调中,得到conn->server_param变量: static int request_handler(struct mg_connection *conn) {
mg_send_header(conn, "Content-Type", "text/plain"); mg_printf_data(conn, "This is a reply from server instance # %s",
(char *) conn->server_param); return 0;
}