0

我正在尝试在 C 中创建一个简单的非并发 Web 服务器。通过在我的 Web 浏览器中打开特定页面(本地主机:54321)。这将连接到我用 C 语言编写的服务器程序,该程序作为回报将发送回一个网页以供浏览器显示。

这是我的代码的摘录:

void reply(char *mesg, int connfd, struct sockaddr_in servaddr, socklen_t len)
{
FILE *fp;
char token1[256];
char *token2;
char response[2048];
char *file;
char *type;
char c_type[50];
char content[2048];

sscanf(mesg, "GET %s HTTP/1.1", file);

if(strcmp(file, "/") == 0){

    fp = fopen("index.html", "r");

    sprintf(c_type, "text/html");

    fgets(content, 256, fp);
    while(!feof(fp)){
        fgets(token1, 256, fp);
        strcat(content, token1);
    }

    sprintf(response,"HTTP/1.1 200 OK\r\n Content-type:%s\r\n Content-length: %d\r\n\r\n%s", c_type, strlen(content), content);

    sendto(connfd,response,strlen(response),0,(const struct sockaddr *)&servaddr,len);

    fclose(fp);
}else{
    token2 = strsep(&file, "/");

    fp = fopen(file, "r");

    if(fp == NULL){\

        sprintf(c_type, "text/html");

        sprintf(content, "<html><body> <h1> ERROR: %s does not exist! </h1> </body></html>", file);

        sprintf(response,"HTTP/1.1 200 OK\r\n Content-type:%s\r\n Content-length: %d\r\n\r\n%s", c_type, strlen(content), content);

        sendto(connfd,response,strlen(response),0,(const struct sockaddr *)&servaddr,len);
    }else{

        type = file;

        token2 = strsep(&type, ".");

        if(strcmp(type, "html") == 0){

            sprintf(c_type, "text/html");

        }else if(strcmp(type, "css") == 0){

            sprintf(c_type, "text/html");
        }else{

            sprintf(c_type, "image/%s", type);
        }

        fgets(content, 256, fp);
        while(!feof(fp)){
            fgets(token1, 256, fp);
            strcat(content, token1);
        }

        sprintf(response,"HTTP/1.1 200 OK\r\n Content-type:%s\r\n Content-length: %d\r\n\r\n%s", c_type, strlen(content), content);

        sendto(connfd,response,strlen(response),0,(const struct sockaddr *)&servaddr,len);
    }

    fclose(fp);
}

当我运行它时,我的程序遇到了分段错误。fgets()如果您对我如何解析文件中的数据有任何想法/意见/建议,我相信这是由于我的使用。谢谢你。

4

0 回答 0