1
首行(Request-Line):
GET /metrics?board_ip=10.17.0.155&type=IMS&board_no=5 HTTP/1.1
这是请求的第一行,包含了HTTP方法(GET)、请求的资源URI(/metrics)以及查询参数(board_ip、type、board_no),还有HTTP协议的版本(HTTP/1.1)。
请求头(Headers):
Host: 192.168.20.5:9001
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
请求头包含了关于请求的附加信息,如请求的目标服务器(Host)、连接类型(Connection)、缓存控制(Cache-Control)、浏览器标识(User-Agent)等。
空行:
在请求头和请求正文之间应该有一个空行,但在您提供的示例中,由于请求是一个GET请求,并且没有请求体(body),所以空行没有显示。在HTTP协议中,这个空行是必须的,用以分隔请求头和请求正文。对于GET请求,请求正文通常是不存在的,因为GET请求的所有数据都包含在URL中。
正文(Body):
对于GET请求来说,通常没有请求正文(body)。请求正文一般用于POST、PUT等请求方法,用于发送需要处理的数据到服务器。在您的示例中,没有显示请求正文,因为这是一个GET请求,它只从服务器检索数据,而不发送数据
基于microhttpd搭建实现http服务器端(C语言)
struct MHD_Daemon *MHD_start_daemon(unsigned int flags,
unsigned short port,
MHD_AcceptPolicyCallback apc,
void *apc_cls,
MHD_AccessHandlerCallback dh,
void *dh_cls,
...);
flags:用于指定服务器的行为选项,可以是以下之一或它们的组合(使用位运算):
MHD_USE_SELECT_INTERNALLY:使用内部的select循环来处理连接,默认使用此选项。
MHD_USE_EPOLL_LINUX_ONLY:使用Linux特定的epoll机制来处理连接。
MHD_USE_POLL:使用poll来处理连接。
MHD_USE_THREAD_PER_CONNECTION:为每个连接启动一个新线程处理。
port:指定服务器监听的端口号。
apc:接受策略回调函数,用于决定是否接受连接。
apc_cls:传递给接受策略回调函数的自定义数据指针。
dh:访问处理器回调函数,用于处理连接的请求和响应。
dh_cls:传递给访问处理器回调函数的自定义数据指针。
...:其他选项,以MHD_OPTION_END作为结束标识。
该函数返回一个MHD_Daemon指针,表示创建的服务器守护进程。如果创建成功,该指针非空;否则,返回NULL。
在您提供的代码中,将使用MHD_start_daemon函数创建一个HTTP服务器守护进程,监听指定的端口号(PORT)。当有连接到达时,将调用answer_to_connection
获取get参数
int iterate_parameters(void *cls, enum MHD_ValueKind kind, const char *key, const char *value)
{
printf("Parameter: %s = %s\n", key, value);
return MHD_YES; // 继续遍历
}
const char *board_ip = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "board_ip");
const char *type = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "type");
const char *board_no = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "board_no");
// 打印参数
printf("board_ip: %s\n", board_ip);
printf("type: %s\n", type);
printf("board_no: %s\n", board_no);
const union MHD_ConnectionValue *value;
const char *key;
MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, iterate_parameters, NULL);