博客
关于我
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/

    你可能感兴趣的文章
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>
    ParseChat应用源码ios版
    查看>>
    Part 2异常和错误
    查看>>
    Pascal Script
    查看>>
    Spring Boot集成Redis实现keyspace监听 | Spring Cloud 34
    查看>>
    Spring Boot中的自定义事件详解与实战
    查看>>
    Passport 密码模式
    查看>>