天天看点

mongoose源码分析系列之server_data1. 所在的结构体定义2. 变量赋值3. 内部使用,转化为server_param4. server_param所在的结构体定义5. Demo举例使用

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;

    }

继续阅读