HTTP 消息头


title: HTTP 消息头
date: 2022-11-16 14:36
tags: [HTTP,X-Real-IP,Host,X-Forwarded-For,Nginx]


〇、问题

  1. 什么是HTTP Headers?
  2. 作用是什么?

一、前言

在配置Nginx时遇到一些Host、X-Real-IP、X-Forwarded-For概念,这些都是HTTP的基本概念,在此学习记录一下。

二、什么是消息头?

HTTP 消息头允许客户端和服务器通过 request和 response传递附加信息。

理解:
例如有一个根据书号查询图书作者的接口,客户端只需要调用接口时传一个书号即可。那HTTP Headers中的客户端IP、cookies等信息就是所谓的附加信息。

三、Host

一个用来保存域名的栏位。

四、X-Real-IP

你往里边存什么,它就是什么。就是一个普通的栏位而已。
如,在Nginx中可以使用如下配置:

proxy_set_header X-Real-IP $remote_addr;

那么其中就会保存$remote_addr,ip_a->ip_b->ip_c,其中ip_b是一台代理,那么ip_c看到的X-Real-IP就是ip_b。

五、X-Forwarded-For


这是用来保存最初发起请示的客户端的IP地址。

参考

  1. HTTP Headers - HTTP | MDN
  2. X-Forwarded-For - HTTP | MDN
  3. X-Forwarded-For 和 X-Real-IP 的区别? - 猪啊美 - 博客园

更新

前往HTTP 消息头 | 张鹏帅的官方网站查看更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以为你提供一些思路和参考代码。 首先,为了使用I/O多路复用,我们可以使用select函数。select函数可以同时监听多个文件描述符的读写事件,从而实现多路复用。 下面是一个简单的使用select函数的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/select.h> #define MAX_CLIENTS 10 #define BUF_SIZE 1024 int main(int argc, char **argv) { int server_sock, client_sock[MAX_CLIENTS]; struct sockaddr_in server_addr, client_addr; fd_set read_fds, write_fds; char buf[BUF_SIZE]; int i, max_fd, fd_num, client_count = 0; // 创建服务器套接字 server_sock = socket(AF_INET, SOCK_STREAM, 0); // 初始化服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8080); // 绑定服务器套接字到指定地址和端口 bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 监听连接请求 listen(server_sock, 5); // 初始化文件描述符集合 FD_ZERO(&read_fds); FD_SET(server_sock, &read_fds); max_fd = server_sock; while (1) { // 复制文件描述符集合 write_fds = read_fds; // 等待文件描述符就绪 fd_num = select(max_fd + 1, &write_fds, NULL, NULL, NULL); // 处理就绪的文件描述符 for (i = 0; i <= max_fd && fd_num > 0; i++) { if (FD_ISSET(i, &write_fds)) { fd_num--; // 处理服务器套接字的连接请求 if (i == server_sock) { // 接受连接请求 int client_fd = accept(server_sock, (struct sockaddr *)&client_addr, sizeof(client_addr)); // 将新的客户端套接字加入文件描述符集合 FD_SET(client_fd, &read_fds); if (client_fd > max_fd) { max_fd = client_fd; } // 记录客户端套接字 client_sock[client_count++] = client_fd; printf("New client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); } // 处理客户端套接字的读写事件 else { // 接收客户端消息 int recv_len = recv(i, buf, BUF_SIZE, 0); // 处理客户端断开连接 if (recv_len == 0) { close(i); FD_CLR(i, &read_fds); printf("Client disconnected: %d\n", i); // 从客户端套接字列表中删除 for (int j = 0; j < client_count; j++) { if (client_sock[j] == i) { for (int k = j; k < client_count - 1; k++) { client_sock[k] = client_sock[k + 1]; } client_count--; break; } } } // 处理客户端消息 else { // TODO: 处理HTTP消息字段,支持响应状态码200、400和404 printf("Received message from client: %s\n", buf); send(i, buf, recv_len, 0); } } } } } // 关闭服务器套接字 close(server_sock); return 0; } ``` 在上面的示例代码中,我们使用了一个循环来等待文件描述符就绪,并通过select函数实现了I/O多路复用。此外,我们还处理了服务器套接字的连接请求和客户端套接字的读写事件。 对于HTTP消息字段和响应状态码的处理,我们需要在接收到客户端的请求后进行解析和处理,并发送相应的响应消息。这部分内容比较复杂,需要根据HTTP协议的规范来实现。在此就不再提供具体的代码了。 希望以上内容能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值