mongoose源码分析系列之server_data

本文详细探讨了mongoose库中server_data结构体的定义、变量赋值过程,以及如何转换为server_param。通过分析其内部使用和提供示例代码,帮助理解mongoose服务器参数的配置和操作。

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值