如何将HTML页面从C Web服务器发送到Web浏览器

时间:2017-11-30 05:58:08

标签: c http tcp server

我用C语言实现了基本的Web服务器,它为客户端的GET请求提供服务。问题是它不发送HTML页面。

{{1}}

这只是接受一个线程的循环,我不发布整个代码,因为一切正常,直到我想发送包含多行文本(例如维基百科文章)的页面后,它试图读取文件web-server就停止了。但如果文件只包含

{{1}}

服务器以适当的方式发送它。 提前致谢。

2 个答案:

答案 0 :(得分:5)

您的代码存在多个问题,但最严重的问题出在此处:

while(fgets(message, 150, resource)!=NULL){
    write(temp_sock[id], "HTTP/1.1 200 OK\n", 16);
    write(temp_sock[id], "Content-length: 151\n", 19);
    write(temp_sock[id], "Content-Type: text/html\n\n", 25);
    write(temp_sock[id], message, 151); //here problems start
}
  1. fgets()仅适用于字符串。读取二进制数据(如图像)时,它会表现不正常。请改用fread();你需要对参数进行重新排序。

  2. HTTP中的响应行必须由\r\n终止,而不仅仅是\n。 (这不会导致您的问题,但无论如何都应该修复它。)

  3. 您发送的内容长度为151是假的。检查文件的实际大小(例如,使用fstat())并发送,或者根本不发送内容长度。这不是强制性的。

  4. 您的代码写的字节数多于读取的字节数。保存fgets()的返回值并将其传递给write()

  5. 您的代码未检查write()的返回值。假设write()将始终写入您提供给它的所有数据是不安全的 - 就像read()一样,它可能会执行部分写入,或者完全失败。

  6. 您的代码正在为其读取的每个数据块发送一组新的HTTP标头。将该代码移到循环之外。

答案 1 :(得分:0)

我认为主要问题是您多次发送HTTP标头。除了@duskwuff提到的问题,你应该改变你的循环

write(temp_sock[id], "HTTP/1.1 200 OK\n", 16);
write(temp_sock[id], "Content-length: 151\n", 19); ///here still is a problem mentioned above
write(temp_sock[id], "Content-Type: text/html\n\n", 25);
while((currLen=fgets(message, 150, resource))!=0){

    write(temp_sock[id], message, currLen);
}