为什么我的服务器只将文件的第一行写入客户端?

时间:2016-02-20 00:02:23

标签: c file-io network-programming server client

我有两个程序,一个简单的客户端和一个简单的服务器,我正在尝试从我的客户端向我的服务器发送HTTP GET请求。在这种情况下,我从我的客户端向我的服务器发送GET /index.html HTTP/1.1\r\n\r\n请求,我让服务器将index.html的内容发送到我的客户端,以便输出到stdout。我已经成功完成了大部分工作,除了客户端只将index.html文件的第一行输出到stdout,我只是看不清楚原因。令我困惑的是,与此相反,我的服务器程序中的printf()正在打印整个index.html。以下是服务器程序的片段:

#include "csapp.h"

int MAXLEN = 10000;
int main(int argc, char* argv[]){

       //some initializations and other things

        if(( in = fopen(req, "r")) == NULL){
            rio_writen(connfd, "Couldn't open file\n", MAXLEN);
            exit(0);
        }
        while (fgets(output, 99999, in) != NULL){
            printf("%s", output); //printing entire thing
            write(connfd, output, sizeof(output)); //should write entire file!

        }
        fclose(in);
        Close(connfd);
    }
    exit(0);
}

以防万一,从我的客户端程序,这是我的客户端从我的服务器读取的方式,虽然我怀疑这是问题发生的地方,例如我可以阅读index.html来自{ {1}}很好,这让事情变得更加混乱。

wwww.google.com

如果有人能让我知道出了什么问题,我将不胜感激。此外,可以找到csapp.c here

1 个答案:

答案 0 :(得分:1)

将您的循环更改为:

    while (fgets(output, sizeof(output), in) != NULL){
        printf("%s", output); //printing entire thing
        write(connfd, output, strlen(output));
    }

从文件读取时应使用sizeof,以确保它不会尝试读取超过缓冲区大小。但是在写作时,你应该只写出包含刚读过的行的buffer部分。您的代码正在编写整个缓冲区,其中包括所有未初始化的字节。