白骑士的C语言教学实战项目篇 4.4 简单HTTP服务器

30 篇文章 0 订阅
22 篇文章 0 订阅

系列目录

上一篇:白骑士的C语言教学实战项目篇 4.3 学生成绩管理系统

        在本项目中,我们将设计并实现一个简单的HTTP服务器,涵盖网络编程基础、HTTP协议解析、多线程处理请求。通过这个项目,我们可以更加深入地了解网络编程、HTTP协议以及多线程编程的基本概念和实现方法。

网络编程基础

        网络编程是计算机科学中的一个重要领域,涉及到通过网络进行数据传输和通信。在C语言中,我们可以使用套接字(socket)来实现网络通信。套接字是网络通信的基本单元,提供了在不同计算机之间进行数据传输的机制。以下是使用套接字实现一个简单的TCP服务器的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>


#define PORT 8080
#define BUFFER_SIZE 1024


void handleClient(int clientSocket) {
    char buffer[BUFFER_SIZE];
    int bytesRead;

    // 读取客户端请求
    bytesRead = read(clientSocket, buffer, BUFFER_SIZE - 1);

    if (bytesRead < 0) {
        perror("读取错误");

        close(clientSocket);

        return;
    }

    buffer[bytesRead] = '\0';

    printf("客户端请求:\n%s\n", buffer);

    // 发送HTTP响应
    const char *response = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n"
                           "<html><body><h1>Hello, World!</h1></body></html>";

    write(clientSocket, response, strlen(response));

    // 关闭客户端套接字
    close(clientSocket);
}


int main() {
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;

    socklen_t addrLen = sizeof(clientAddr);

    // 创建套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);

    if (serverSocket < 0) {
        perror("套接字创建失败");

        exit(EXIT_FAILURE);
    }

    // 绑定地址和端口
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        perror("绑定失败");

        close(serverSocket);

        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(serverSocket, 5) < 0) {
        perror("监听失败");

        close(serverSocket);

        exit(EXIT_FAILURE);
    }

    printf("服务器正在运行,等待连接...\n");

    while (1) {
        // 接受客户端连接
        clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);

        if (clientSocket < 0) {
            perror("连接接受失败");

            close(serverSocket);

            exit(EXIT_FAILURE);
        }

        // 处理客户端请求
        handleClient(clientSocket);
    }

    // 关闭服务器套接字
    close(serverSocket);

    return 0;
}

HTTP协议解析

        HTTP(HyperText Transfer Protocol)是用于在Web浏览器和Web服务器之间传输数据的协议。在本项目中,我们将实现一个简单的HTTP服务器,能够解析HTTP请求并返回HTTP响应。HTTP请求包括请求行、请求头和请求体,服务器需要解析这些内容并根据请求类型做出相应的响应。

多线程处理请求

        为了提高服务器的性能和响应速度,我们可以使用多线程来处理多个客户端请求。每当有新的客户端连接时,服务器可以创建一个新的线程来处理该连接。以下是使用多线程处理客户端请求的示例代码:

#include <pthread.h>


// 线程处理函数
void *threadFunction(void *arg) {
    int clientSocket = *(int *)arg;

    handleClient(clientSocket);

    free(arg);

    return NULL;
}


int main() {
    int serverSocket, *clientSocket;
    struct sockaddr_in serverAddr, clientAddr;

    socklen_t addrLen = sizeof(clientAddr);

    // 创建套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);

    if (serverSocket < 0) {
        perror("套接字创建失败");

        exit(EXIT_FAILURE);
    }

    // 绑定地址和端口
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        perror("绑定失败");

        close(serverSocket);

        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(serverSocket, 5) < 0) {
        perror("监听失败");

        close(serverSocket);

        exit(EXIT_FAILURE);
    }

    printf("服务器正在运行,等待连接...\n");

    while (1) {
        // 接受客户端连接
        clientSocket = malloc(sizeof(int));
        *clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);

        if (*clientSocket < 0) {
            perror("连接接受失败");

            close(serverSocket);

            exit(EXIT_FAILURE);
        }

        // 创建新线程处理客户端请求
        pthread_t threadId;

        if (pthread_create(&threadId, NULL, threadFunction, clientSocket) != 0) {
            perror("线程创建失败");

            close(*clientSocket);

            free(clientSocket);
        }

        // 分离线程
        pthread_detach(threadId);
    }

    // 关闭服务器套接字
    close(serverSocket);

    return 0;
}

总结

        通过本项目,我们实现了一个简单的HTTP服务器,涵盖了网络编程基础、HTTP协议解析、多线程处理请求等模块。这个项目不仅让我们掌握了C语言中网络编程和多线程编程的基本方法,还提升了我们对HTTP协议的理解。在实际应用中,可以根据需要扩展服务器的功能,例如添加更多的HTTP请求处理逻辑,或使用更高级的多线程和网络编程技术。

下一篇:白骑士的C语言教学附加篇 5.1 C语言开发工具​​​​​​​

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白骑士所长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值