博客
关于我
Linux套接子(c语言)模拟http请求、应答
阅读量:285 次
发布时间:2019-03-01

本文共 3085 字,大约阅读时间需要 10 分钟。

制作HTTP协议服务端代码与客户端代码

通过本地服务器实现简单的HTTP协议通信,能够帮助我们理解HTTP协议的工作原理。以下是基于C语言实现的HTTP协议服务端和客户端代码,以及相关的操作说明。

HTTP协议基础

HTTP协议是用于在分布式系统中传输网页内容的协议。其特点包括:

  • 无状态性:HTTP协议并不保留客户端和服务器之间的状态信息。
  • 可缓存性:服务器可以向客户端发送缓存指令,以减少数据传输量。
  • 可扩展性:HTTP协议支持通过扩展如HTTP/1.1版本实现更复杂的功能。
  • 服务端代码实现

    服务端代码基于以下思路:

  • 使用多线程处理客户端请求,提高服务器的吞吐量。
  • 接收客户端的HTTP请求,并返回预定义的响应内容。
  • 服务端代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define BUFFER_SIZE 1024#define NUM_THREADS 4void* thread.HandlerFunc(void* arg) { int client_socket = (int)arg; char http_response[2048] = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\nConnection: close\r\n\hello world!\r\n"; // 接收客户端请求 char request[BUFFER_SIZE] = {0}; int n = read(client_socket, request, BUFFER_SIZE); printf("Client request: %s\n", request); // 发送响应 send(client_socket, http_response, strlen(http_response), 0); close(client_socket); printf("Client connection closed\n");}int main() { int server_socket; struct sockaddr_in server_addr; int opt = 1; // 创建套接子 server_socket = socket(AF_INET, SOCK_STREAM, 0); assert(server_socket != -1); // 设置服务器地址和端口 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); // 使用80端口 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 监听本地主机 // 绑定套接子 bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); assert(bind == 0); // 开始监听 listen(server_socket, 5); // 最多同时接收5个连接请求 // 处理客户端连接 while (1) { int client_socket; struct sockaddr_in client_addr; int addr_len = sizeof(client_addr); // 接收客户端连接 client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &addr_len); if (client_socket < 0) { continue; } // 启动一个新的线程处理客户端请求 pthread_t thread; pthread_create(&thread, NULL, thread.HandlerFunc, (void*)client_socket); } close(server_socket); return 0;}

    编译与运行

  • 编译
  • gcc -pthread -o server server.c
    1. 运行
    2. sudo ./server

      客户端代码示例

      #include 
      #include
      #include
      #include
      #include
      #include
      #include
      int main() { int client_socket; struct sockaddr_in server_addr; // 创建套接子 client_socket = socket(AF_INET, SOCK_STREAM, 0); assert(client_socket != -1); // 设置服务器地址和端口 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); // 使用80端口 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器地址 // 连接到服务器 int result = connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); assert(result != -1); // 发送HTTP请求 char request[1024] = "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: Close\r\n\r\n"; int bytes_sent = send(client_socket, request, strlen(request), 0); printf("Sent %d bytes\n", bytes_sent); // 接收服务器响应 char response[BUFFER_SIZE] = {0}; int bytes_received = recv(client_socket, response, BUFFER_SIZE, 0); printf("Received %d bytes\n", bytes_received); // 关闭套接子 close(client_socket); return 0;}

      使用说明

    3. 服务端

      • 监听本地127.0.0.1:80端口。
      • 使用多线程处理每个客户端请求。
      • 每次连接后自动关闭,服务器状态会在TIME_WAIT后继续监听。
    4. 客户端

      • 向本地服务器发送HTTP请求。
      • 接收服务器返回的HTTP响应。
      • 依次打印请求和响应内容。
    5. 通过以上代码,我们可以在本地机器上通过浏览器访问localhost,观察客户端与服务器之间的通信过程。

    转载地址:http://hoio.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>
    OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
    查看>>
    OpenCV与AI深度学习 | 什么是 COCO 数据集?
    查看>>
    OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
    查看>>
    OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
    查看>>
    OpenCV与AI深度学习 | 使用 OpenCV 创建自定义图像滤镜
    查看>>
    OpenCV与AI深度学习 | 使用 SAM 和 Grounding DINO 分割卫星图像
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV检测并计算直线角度
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV轮廓检测提取图像前景
    查看>>