• C语言-写一个简单的Web服务器(一)


    基于TCP的web服务器

    概述

    C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。
    关于网络的TCP协议在这里不在多说,大家可以查阅些资料。

    工具

    开发工具: CLion,编译器(Cygwin,如果不会用建议看看我的另一篇博客-CLion)。

    演示效果图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    ## 创建socket对象
    
    ```C
    int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    if (0 > server_socket) {
        printf("[服务器] 创建socket对象失败,服务器启动失败...\n");
        return -1;
    }
    printf("[服务器] 创建socket成功....\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    绑定服务器端口

    struct sockaddr_in my_addr;
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(PORT);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    
    int bind_ret = bind(server_socket, (struct  sockaddr*) &my_addr, sizeof(my_addr));
    
    if (0 > bind_ret) {
        printf("[服务器]绑定端口%d失败,服务器启动失败\n", PORT);
        return -2;
    }
    printf("[服务器] 绑定端口:%d成功....\n", PORT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    监听服务器端口

    int listen_ret = listen(server_socket, BACK_LOG);
    if (0 > listen_ret) {
        printf("监听端口:%d失败,服务器运行失败....\n", PORT);
        return -3;
    }
    printf("[服务器] 监听端口:%d成功....\n", PORT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    建立连接

    struct sockaddr_in accept_in;
    socklen_t socklen = sizeof(accept_in);
    int accept_socket = accept(server_socket, (struct sockaddr *) &accept_in, &socklen);
    
    if (-1 == accept_socket) {
        printf("[服务器] 接收请求失败,建立连接失败... \n");
        return -4;
    }
    printf("[服务器] 建立连接成功....\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    获取客户端请求

    char buffer[BUFFER_SIZE];
    memset(buffer, 0, sizeof(buffer));
    ssize_t data = recv(accept_socket, buffer, sizeof(buffer), RECV_FLAG);
    
    
    if (data == 0) {
        printf("[服务器] 超时或对端主动关闭...\n");
        break;
    }
    if (0 > data) {
        printf("[服务器] 接收数据失败...\n");
        break;
    }
    
    printf("[服务器] 与客户端建立连接成功...\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    启动服务器

    [服务器] 创建socket成功....
    [服务器] 绑定端口:9999成功....
    [服务器] 监听端口:9999成功....
    [服务器] 建立连接成功....
    [服务器] 与客户端建立连接成功...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下一回我们研究如何解析前端(浏览器)发过来的数据。

  • 相关阅读:
    Paddle模型转onnx, PP-OCR系列模型列表
    一文读懂存内计算与近存计算的分类与应用
    基于SSH开发的网上花店系统
    linux 查看进程的几个方法
    MySQL--MySQL表的增删改查(进阶)
    如何在Windows系统搭建VisualSVN服务并在公网远程访问【内网穿透】
    【总结】kubernates crd client-java 关于自定义资源的增删改查
    将数组A中的内容和数组B中的内容进行交换。(数组一样大)
    Suse12安装docker
    Windows性能监控工具ypeperf
  • 原文地址:https://blog.csdn.net/qq_36115196/article/details/136577018