html - C 语言的服务器实现

标签 html c parsing server segmentation-fault

我目前正在开发一台服务器,这是我类(class)要求的一部分。规范要求我解析请求行并将适当的数据存储为绝对路径 (abs_path) 和查询。

这是我的代码:

bool parse(const char* line, char* abs_path, char* query)

{ int 空间 = 0;

if (strchr(line, '"') != NULL)
{
    error(400);
    return false;
}

for (int i = 0; line[i] != '\0'; i++)
{
    if (line[i] == ' ')
    {
        space++;
    }
}

if (space != 2)
{    
    error(400);
    return false;
}

if (strncmp("GET ", line, 4) != 0)
{    
    error(405);
    return false;
}

line = strchr(line, ' ');
line++;

if (strncmp("/", line, 1) != 0)
{
    error(501);
    return false;
}

int j = 0;
int k = 4;

while (line[k] != ' ')
{
    int m = k;
    abs_path[j] = line[k];
    j++;
    if (line[k+1] == '?')
    {
        abs_path[j] = '\0';
        int l = 0;
        m = k+2;

        while (line[m] != ' ')
        {
            query[l] = line[m];
            l++;
            m++;
        }
        if (line[m] == ' ' && l == 0)
        {
            query[0] = '\0';
        }
    }
    k = m;
    k++;
    if (line[k] == ' ')
    {
        abs_path[j] = '\0';
        break;
    }
}

char* last = strrchr(line, ' ');
last++;
if (strcmp("HTTP/1.1", last) != 0)
{
    error(505);
    return false;
}
free(abs_path);
return true;

}

我一直遇到这样的段错误。经过一些调试后,我发现如果我在第 20 行将 abs_path 声明为数组而不是指针,则可以消除段错误。但是,我有必要将abs_path声明为指针,所以我需要另一个解决方案。有人可以向我解释一下我在字符串及其处理方面到底做错了什么吗?

由于个人原因,我对此很生疏,所以如果我误解了一些基本的东西,请原谅我。

提前谢谢您!

最佳答案

您需要为 char* 分配内存。数组在编译时自动执行此操作。尝试使用 malloc。

char* abs_path = 0;
abs_path = (char*)malloc(256);

本质上,malloc 执行操作系统调用以从堆中保留顺序内存。 malloc 的参数是要保留多少字节。因此,您应该注意,上面的示例使 abs_path char* 能够指向最多 255 个字符的字符串(为空字符“\0”留下 1 个字节)。不要让您的代码写入超过 255 个字符,否则您将覆盖内存中的其他数据,这就是您之前收到段错误的原因。

正如其他人指出的,您绝对应该释放使用 malloc 动态保留的内存。

free(abs_path);

关于html - C 语言的服务器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594375/

相关文章:

javascript - ng-repeat - 一旦弹出,就无法推送

python - beautifulsoup 和无效的 html 文档

javascript - 单击按钮时取消选中复选框

html - Magento 模板/布局如何更改产品 View

c - NetHack 源代码中的 "NEARDATA"是什么意思?

c - fgets 读取使用 popen 执行的程序完成后的行

用于传递多个可变参数的 C 宏

ios - Objective-C iOS 根据定义解析字符串

java - 解析 XML 文本列表

JavaScript,一张图像而不是许多张图像