C语言构建小型Web服务器

本文介绍了一个用C语言编写的简易Web服务器实现过程。该服务器通过监听指定端口接收来自浏览器的请求,并能响应静态HTML页面。文章详细展示了创建socket、绑定地址、监听连接请求、接收并解析HTTP请求以及发送HTTP响应等步骤。
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <zconf.h>

#define PORT 8080        // 服务器监听端口
#define MAX_QUEUE 5     // 待连接的队列最大数
#define MAX_LEN 1024    // 接收浏览器数据

int main(){
    int server_socket_fp;   // 服务端socket句柄
    struct sockaddr_in server_addr;   // 地址结构体
    char buff[MAX_LEN];

    /**
     * 创建socket
     * AF_INET: IPV4网络操作
     * SOCK_STREAM: 使用TCP协议传输数据
     * 0: 自动选择协议
     */
    if ((server_socket_fp = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        printf("create socket failed");
        exit(EXIT_FAILURE);
    }

    /**
     * 将socket与地址绑定
     * bind参数:
     *     socket描述符
     *     地址结构体,需要强转成struct sockaddr类型
     *     结构体长度,传入的是指针,无法再函数内部获取长度
     */
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   // INADDR_ANY表示任何地址访问都可以
    server_addr.sin_port = htons(PORT);   // 端口号
    if (bind(server_socket_fp, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        printf("bind socket with addr struct failed!");
        exit(EXIT_FAILURE);
    }

    /**
     * 监听链接
     * 参数:
     *     socket描述符
     *     待连接队列的最大个数,一般为5
     */
    listen(server_socket_fp, MAX_QUEUE);

    /**
     * 与客户端建立连接
     * 参数:
     *     socket文件描述符
     *     客户端地址信息的结构体,不关心可以传NULL
     *     客户端地址长度,不关心可以传NULL
     * 返回值:
     *     socket文件描述符,在与客户端建立连接后,accpet还是会生成一个专门用于和当前客户端通信的socket,
     *     而原来那个socket照常负责和其他等待建立连接的客户端建立通信
     */
    int client_socket_fp = accept(server_socket_fp, NULL, NULL);

    /**
     * 读取浏览器的内容
     * 参数:
     *     文件描述符,从哪个文件读,这里填写accept返回的文件句柄
     *     读的内容存到buff中
     *     共读多少个字节
     */
    read(client_socket_fp, buff, MAX_LEN);
    printf("%s", buff);

    /**
    * 向浏览器写入内容
    * 参数:
    *     文件描述符,往哪个文件写,这里填写accept返回的文件句柄
    *     内容的首地址
    *     共读多少个字节
    */
    char status[] = "HTTP/1.0 200 OK\r\n";
    char header[] = "Server: DWBServer\r\nContent-Type: text/html;charset=utf-8\r\n\r\n";
    char body[] = "<html><head><title>C语言构建小型Web服务器</title></head><body><h2>欢迎</h2><p>Hello,World</p></body></html>";

    write(client_socket_fp, status, sizeof(status));
    write(client_socket_fp, header, sizeof(header));
    write(client_socket_fp, body, sizeof(body));

    close(client_socket_fp);
    close(server_socket_fp);
    return 0;
}

原文:https://www.jianshu.com/p/592b631e1ff1

转载于:https://www.cnblogs.com/Myarticles/p/10599976.html

C语言实现的支持高并发、超高性能Web服务器源码,可以编译运行,使用高性能HTTP解析器fasterhttp作为其解析核心,在开启Keep-Alive和gzip压缩时(现代浏览器默认开启)性能比nginx约快3倍。 hetao功能: * 支持主流操作系统Linux(基于epoll)、WINDOWS(基于IOCP,暂不支持HTTPS) * 支持HTTP/1.0、HTTP/1.1 * 支持通讯超时控制 * 支持多侦听端口 * 支持多虚拟主机(基于域名) * 支持自定义错误页面 * 支持自定义缺省index文件 * 支持自适应Keep-Alive * 支持自适应gzip、deflate压缩 * 支持HTTPS * 支持反向代理负载均衡(目前支持轮询、最少 连接数算法),支持HTTP与HTTPS互转 * 支持rewrite * 支持优雅重启/重载配置,重启期间完全不中断对外服务 * 支持工作进程绑定CPU * 支持进程 崩溃后自动重启安全机制: * HTTP请求报文合法性校验 * 活跃超时控制(防止僵尸连接)和累积超时控制(防止慢速攻击) * 每个IP连接数 限制 * 全局最大连接数限制 * 最大单个文件缓存大小 选择hetao的理由: *在Linux上的综合性能约比Nginx还要快三倍,尤其适合中小型静 态文件 * hetao是众多开源Web服务器中在WINDOWS版本唯一全部采用IOCP模型。Apache的WINDOWS版本是传统的Leader-Follow多进程模型,Nginx则 是多线程select模型(玩具?) * 配置文件采用JSON标准格式,简洁易写,而且支持行注释和块注释。Apache配置格式比较复杂,Nginx配置 格式多变怪异且不支持块注释 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值