Http协议

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);
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值