搭建简单的http服务器

开发语言C++,平台为Linux。
主要流程为:服务器获得请求–>响应并处理请求–>返回结果。

这里写图片描述

这里着重讲怎么处理请求。
主程序在获得一个请求后会开辟一个线程来处理请求
流程图如下。
这里写图片描述

hand_cgi函数流程图
这里写图片描述

cgi程序流程图。
这里写图片描述
代码:

#include"http.h"

int ret = 0;
void printf_log(string s){

        //cout << s << endl;
}

int init_fd(int socketi, char* str){

    sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(inet_addr(str));
    addr.sin_port = htons(PORT);

    int err = bind(socketi, (struct sockaddr*)&addr, sizeof(addr));
    if (err < 0){
        printf_log("bind error");
        ret = -1;
    }
    int on = 0;
    setsockopt( socketi, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
    err = listen(socketi, 5);
    if (err < 0){
        printf_log("listen error");
        ret = -1;
    }
    return socketi;
}



static int get_line(int fd, char *buf){

    char ch = 0;
    char next = 0;
    int i = 0;
    int err = 0;
    while (ch != '\n'){

        int size = read(fd, &ch, 1);
        if (size <= 0){
            ch = '\n';
        }

        if (ch != '\n' && ch != '\r'){

            buf[i++] = ch;
        }
        else{
            if (ch == '\r'){

                err = recv(fd, &next, 1, MSG_PEEK);
                if (err < 0){
                    printf_log("recv error");
                    return -1;
                }

                if (next == '\n'){

                    err = read(fd, &ch, 1);
                    if (err < 0){
                         printf_log("recv error");
                        return -1;
                    }

                }//if

                ch = '\n';

            }

        }//else


    }//while


buf[i] = 0;

    return 1;
}

static void clean_header(int fd){


    char ch[100] = {
  0};
    get_line(fd, ch);
    while (strlen(ch) != 0){

        get_line(fd, ch);
    }



}

static int hand_cgi(int fd, char* path, char * argument){

    char line[SIZE/2] = {
  0};
    char length[10] = {
  0};
    int i_length = 
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值