使用C中的文件描述符查找文件流的大小

时间:2014-09-03 14:01:56

标签: c http file-descriptor

作为一项学校作业,我在C中编写了一个简单的HTTP网络服务器。 我准备好了大部分代码,但send() / write()要求发送邮件的长度。

这是我挣扎的地方。 fseek()不起作用,因此ftell()会返回"非法搜寻" errno。在确定方法并检索正确的响应代码之后,我使用fprintf()直接写入文件流。

static void response(FILE *response, int code, char *path, int fd)
{
    FILE *body;
    char *line = makestring(300) //Creates an empty string of size 300

    ... // Replace code in between with other code block

    if(code == 200){
        http_ok(response); //A function with fprintf's to write the headers.
        body = fopen(path, "w");

        while(!feof(body)){
            fgets(line, 300, body);
            fprintf(response, "%s\r\n", line);
        }

    fclose(body);
    }

    ... // Replace up to this point

fseek(response, 0L, SEEK_END);
int response_size = ftell(response);
rewind(response);

send(fd, response, response_size, 0);
}

现在,这是我的代码的简化版本,仅包括状态200。 事情是在这里正确返回响应,并在浏览器中打开页面。但是,response_size变量始终打印到-1

现在继续执行状态代码301 Moved Permanently,它根本不起作用。此代码可以替代两个" ..." s

之间的其他if语句。
...
if(code == 301){
    http_moved(response, path);
}
...

http函数看起来像这样

void http_ok/moved(FILE *response)
{
    fprintf(response, "Correct codes and headers for the response type here\r\n")
    ...
    fprintf(response, "\r\n\r\n")
}

使用FILE在套接字的文件描述符上打开响应fdopen(sockfd, "w"),因此它不是正常fopen()。就我的理解而言,这意味着fseek()无法按预期工作。

至于问题本身,当我使用文件描述符时,如何获得适当长度的http响应?

1 个答案:

答案 0 :(得分:0)

如果保证响应指向文件,我会使用:

#include <sys/stat.h>

struct stat st;

if (fstat(fileno(response)), &st) == -1) {
    /* handle error */
} else {
     response_size = (int)st.st_size;
}