首页 > C实现的web服务器 总提示连接被重置

C实现的web服务器 总提示连接被重置

尝试用C实现一个简单的http服务器,遇到了些小问题,请大神帮帮忙

流程:

启动服务器监听端口 -> accept 请求后创建线程处理 -> 返回结果

问题:

  1. 向客户端send完结果之后,如果 close() 浏览器页面就会显示 “连接被重置”
  2. 如果不close , 页面就会一直加载中

思考:

是我返回的http数据不完整还是其他原因呢?

代码:

     char buf[1024];

     //发送header
     sprintf(buf, "HTTP/1.0 200 OK\r\n");
     send(client_fd, buf, strlen(buf), 0);

     sprintf(buf,"Content-Type: text/html;charset=utf-8\r\n");
     send(client_fd, buf, strlen(buf), 0);
     sprintf(buf, "\r\n");
     send(client_fd, buf, strlen(buf), 0);

     //发送内容
     sprintf(buf, "<HTML><head><title>test</title></head>");
     send(client_fd, buf, strlen(buf), 0);

     sprintf(buf, "<body><h1>welcome</h1></body></HTML>");
     send(client_fd, buf, strlen(buf), 0);

     //关闭连接
     close(client_fd);

因为你的浏览器不知道你的数据是否返回完毕了,你需要把你要响应的正文长度告诉浏览器,使用HTTP响应头里面的Content-Length

Cchar *body = "<HTML>。。。。。。。</HTML>";    // 要响应的正文

sprintf(buf, "HTTP/1.0 200 OK\r\n");
send(client_fd, buf, strlen(buf), 0);

sprintf(buf,"Content-Type: text/html;charset=utf-8\r\n");
send(client_fd, buf, strlen(buf), 0);

// 设置正文长度Content-Length
sprintf(buf,"Content-Length: %d\r\n", strlen(body));
send(client_fd, buf, strlen(buf), 0);

sprintf(buf, "\r\n");
send(client_fd, buf, strlen(buf), 0);

//发送正文
send(client_fd, body, strlen(body), 0);

sprintf(buf, "\r\n");
send(client_fd, buf, strlen(buf), 0);

还有另外一种方式,稍微麻烦一些,头里面用“Transfer-Encoding:chunked”,相关细节你百度一下。


那是因为你没有写头部content length的缘故

【热门文章】
【热门文章】