我有两个程序,一个简单的客户端和一个简单的服务器,我正在尝试从我的客户端向我的服务器发送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。
答案 0 :(得分:1)
将您的循环更改为:
while (fgets(output, sizeof(output), in) != NULL){
printf("%s", output); //printing entire thing
write(connfd, output, strlen(output));
}
从文件读取时应使用sizeof
,以确保它不会尝试读取超过缓冲区大小。但是在写作时,你应该只写出包含刚读过的行的buffer
部分。您的代码正在编写整个缓冲区,其中包括所有未初始化的字节。